【问题标题】:Tomcat Servlet 3.0 multipart file upload name clash in temp folder临时文件夹中的Tomcat Servlet 3.0多部分文件上传名称冲突
【发布时间】:2019-04-05 14:21:08
【问题描述】:

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

测试

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

结果

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

有没有办法避免这种情况 - 除了将fileSizeThreshold 设置为高于maxFileSize 之外,它一开始就不会被写入磁盘。

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

【问题讨论】:

  • 这很奇怪,因为通常如果您创建一个临时文件,它的名称将类似于 foo4516312942348137264.pdf。如果 A 上传 fooA.pdf 而 B 上传 fooB.pdf 可以吗?你能展示你是如何处理MultipartFile的吗?
  • 临时文件的名称可能是随机的(我没有检查),但对于两个请求来说显然是相同的。
  • Apache commons-fileupload 显然没有这个问题。

标签: spring-boot tomcat file-upload multipart


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2018-11-20
    • 2011-01-12
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多