上传文件并直接将其流式传输到磁盘,而不会将其存储在内存中
问题描述:
我有一个控制器,它允许我通过PUT上传文件。文件内容(byte [])首先存储在内存中,然后写入磁盘。上传文件并直接将其流式传输到磁盘,而不会将其存储在内存中
有没有办法直接将文件流式传输到磁盘而不将其存储在内存中?
的代码是在这里:
package dummy;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
public class WebController {
@RequestMapping(value = "/upload", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void addCardproviderLogo(final HttpEntity<byte[]> requestEntity) throws IOException {
final byte[] payload = requestEntity.getBody();
FileUtils.writeByteArrayToFile(new File("/tmp/myfile-" + System.currentTimeMillis() + ".tmp"), payload);
}
}
答
你可以使用MultipartHttpServletRequest,比你可以提取包含的InputStream数据库
public Map uploadFile(MultipartHttpServletRequest defaultMultipartHttpServletRequest,
@PathVariable(CommonConstants.PUBLIC_PROCUREMENT_ID) Integer id,
@PathVariable(CommonConstants.PARCEL_ID) Integer parcelId) {
LOGGER.debug("upload item file for public procurement {}", id);
CommonsMultipartFile file = (CommonsMultipartFile) (defaultMultipartHttpServletRequest.getFile(FILE_DATA) == null ?
defaultMultipartHttpServletRequest.getFile(FILE_DATA_EXPLORER) : defaultMultipartHttpServletRequest.getFile(FILE_DATA));
}
上坚持的CommonsMultipartFile您使用Java 7+,不要”你呢?如果是,为什么使用'File'而不是java.nio.file?其次,你不能从你的放入请求中获得一个'InputSream'吗? – fge