HttpServletRequest如何重复读取上传文件(MultipartFile)?

在HandlerInterceptor的preHandle方法通过以下代码读取文件:

            String hotBackupTempFile = "/home/file";
            List<File> uploadFile = new ArrayList<>();
            if (ServletFileUpload.isMultipartContent(request)){
                MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                MultiValueMap<String, MultipartFile> fileMap = multipartRequest.getMultiFileMap();
                for (Map.Entry<String, List<MultipartFile>> entry : fileMap.entrySet()) {
                    for (MultipartFile m : entry.getValue()) {
                        String fileName = m.getOriginalFilename();
                        File tempFileFolder = new File(hotBackupTempFile);
                        if (!tempFileFolder.exists()) tempFileFolder.mkdirs();
                        File upload = new File(hotBackupTempFile  + "/" + fileName);
                        m.transferTo(upload);
                        uploadFile.add(upload);
                    }
                }
            }

然后在controller就读不到文件了:

@ResponseBody
@RequestMapping("/add")
public JSON addFile(@RequestParam(value = "file",required = false) MultipartFile[] multipartFile) {}

如何才能实现重读读取文件?

阅读 4.4k
2 个回答

很简单,不要使用 transferTo

MultipartFile.getBytes

FileUtil.writeBytes(file.getBytes(), "test1");
FileUtil.writeBytes(file.getBytes(), "test2");

tomcat接收MultipartHttpServletRequest请求中的文件时,会将文件先放到临时目录中,(打断点可以看到MultipartFile的存储路径),而MultipartFile的transferTo方法会将临时目录中的文件移除,所以如果还要在后续拿到文件的话,不能使用该方法。

解决方法:通过MultipartFile的getInputStream方法拿到文件流后,写入到目标文件即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题