我开发了一个文件服务器,它必须使用spring boot处理大文件上传(> 1G B)。当我不想使用主内存时,如何实现上传?
这是我的代码:
final String id = GenerationHelper.uuid();
final File newFile = new File(id);
LOG.info("New file: " + id + " with size " + content.getSize());
if (!content.isEmpty()) {
FileInputStream in = null;
FileOutputStream out = null;
long totalBytes = 0;
try {
in = (FileInputStream) content.getInputStream();
out = new FileOutputStream(newFile);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer);
totalBytes += bytesRead;
LOG.info(bytesRead);
}
} catch (IOException e) {
LOG.error("Failed to save file", e);
newFile.delete();
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
LOG.error("Error creating new file with id " + id + ". Deleting this file...", e);
}
}
LOG.info(totalBytes + " Bytes read");
}
文件完全上传后,日志输出开始,所以我猜该文件已经上传。是否可以直接将文件上传到文件系统?
提前致谢! 最大
答案 0 :(得分:1)
分段上传将被写入磁盘上的临时位置或保存在内存中。正如MultipartFile
的javadoc中所解释的那样,您有责任在请求处理结束之前将文件清理到永久位置。
文件内容存储在内存中或临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级或持久性存储。临时存储将在请求处理结束时被清除。
您可以通过调用MultiPartFile.transferTo(File)
来移动内容(从内存或磁盘上的临时位置)。
文件是保存在内存中还是写入临时位置取决于底层实现。例如,Commons File Upload将在内存中存储小于10240B的文件,并将更大的文件写入磁盘。