temp文件夹中的Tomcat Servlet 3.0多部分文件上传名称冲突

时间:2019-04-05 14:21:08

标签: spring-boot tomcat file-upload multipart

看来Tomcat没有处理两个不同用户对同一分段文件的并行上传。

测试

  • 两个会话/用户A和B
  • 两者均或多或少地同时上传具有相同名称的20MB文件 foo.pdf
  • 默认配置的Servlet 3.0请求将两个文件存储在tmp文件夹中
  • 两个线程都尝试将foo.pdf写入tmp文件夹

结果

  • 上传的文档已损坏(有两个流向其中写入内容)
  • 较慢的请求将失败,并显示FileNotFoundException,因为较快请求的清理任务已删除了tmp文件。

有没有一种避免这种情况的方法-除了将fileSizeThreshold设置为高于maxFileSize之外,这样一来就永远不会将其写入磁盘。

旁注:这是一个Spring Boot 2.1应用程序,但这无关紧要,因为它默认情况下使用此Servlet 3.0实现。

1 个答案:

答案 0 :(得分:0)

我有一个答案,但这并不令人满意。我们没有弄清楚如何使它与Tomcat的Servlet 3.0实现一起使用。但是,一旦我们切换到Apache commons-fileupload,一切都很好。

所以,对于Spring (Boot) applications,您会

  • 设置spring.servlet.multipart.enabled: false
  • 配置名称为CommonsMultipartResolver的类型为multipartResolver的bean
  • 添加commons-fileupload依赖项