经过一些调查后,我发现只有在Tomcat处理请求时,MultipartFile才存在于临时目录中.在响应后它删除文件.这就是尺寸为零的原因.可以使用自定义结构将此数据存储在内存或DB或其他位置.
这是一个例子:
public class UploadedFile { private final String originalFilename; private final byte[] data; public UploadedFile(String fileName, byte[] data) { this.originalFilename = fileName; this.data = data.clone(); } public String getOriginalFilename() { return originalFilename; } public byte[] getData() { return data.clone(); } public int getSize() { return data.length; } }
在内存存储的情况下,可以使用MultipartFile类.如果文件没有存储在硬盘上,只要你有参考文件,它就存在于内存中.
以下是application.properties文件的示例:
multipart.file-size-threshold=10Mb multipart.max-file-size=10Mb multipart.max-request-size=10Mb
multipart.file-size-threshold强制所有上传的文件最多10MB存储在内存而不是HDD中.默认情况下,它等于0,所有文件都存储在HDD上.
我还发现使用HttpSession不是一个优雅的决定. @SessionAttributes注释与Model一起使这个解决方案相当清晰.
这是更新的控制器:
@Controller @SessionAttributes(value = {"uploadedFiles"}) public class IndexController { @ModelAttribute("uploadedFiles") public ListinitUploadedFiles() { return new ArrayList<>(); } @RequestMapping("/") public String index() { return "index"; } @RequestMapping(value = "upload", method = RequestMethod.POST) public String index(Model model, @RequestParam MultipartFile[] files, @ModelAttribute("uploadedFiles") List uploadedFiles) { for (MultipartFile file : files) { try { uploadedFiles.add(new UploadedFile(file.getOriginalFilename(), file.getBytes())); } catch (IOException e) { throw new RuntimeException("Can't read file " + file.getOriginalFilename(), e); } } model.addAttribute("uploadedFiles", uploadedFiles); return "redirect:"; } }