Spring多部分文件上传如何正常工作?

时间:2015-12-15 18:12:23

标签: spring spring-boot

我开发了一个文件服务器,它必须使用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");
    }

文件完全上传后,日志输出开始,所以我猜该文件已经上传。是否可以直接将文件上传到文件系统?

提前致谢! 最大

1 个答案:

答案 0 :(得分:1)

分段上传将被写入磁盘上的临时位置或保存在内存中。正如MultipartFile的javadoc中所解释的那样,您有责任在请求处理结束之前将文件清理到永久位置。

  

文件内容存储在内存中或临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级或持久性存储。临时存储将在请求处理结束时被清除。

您可以通过调用MultiPartFile.transferTo(File)来移动内容(从内存或磁盘上的临时位置)。

文件是保存在内存中还是写入临时位置取决于底层实现。例如,Commons File Upload将在内存中存储小于10240B的文件,并将更大的文件写入磁盘。