【发布时间】: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