Safari 18.5 向启用HTTP/2的Tomcat服务器上传文件时损坏的问题排查求助
Safari 18.5 向启用HTTP/2的Tomcat服务器上传文件时损坏的问题排查求助
大家好,我最近遇到一个非常棘手的文件上传问题,折腾好几天都没找到根因,特意来求助各位大佬!
核心问题现象
- 当使用Safari 18.5通过表单向启用了HTTP/2的Tomcat 11.0.9服务器上传文件时,所有上传后的文件都会损坏
- 以下场景完全正常,没有任何问题:
- 使用Chrome 137.0.7151.122,无论服务器启用HTTP/1.1还是HTTP/2,文件上传后都完整无损
- 禁用Tomcat的HTTP/2功能后,用Safari上传文件也完全正常
测试文件详情
我用了几种不同类型、大小在1.5M-4.1M之间的文件做测试,都能稳定复现问题:
- 1.7M sample.HEIC
- 4.1M sample.jpg
- 2.1M sample.pdf
- 2.0M sample.txt
- 1.5M sample.zip
SHA256校验结果对比
我对原始文件和各种场景下上传后的文件做了SHA256校验,结果差异非常明显:
原始文件哈希值
2ee389fa00d2190c5527eeb171c0eb7d8fe5a2f34c972954ba97c9675c4a0c84 sample.HEIC 8a2479fe45f93ff6901151817f257eccbdf0c673e3660124be90da5344f02958 sample.jpg a5624f2b47bd8ee257bead36bb32a37ab4b01fa0675f608c1edf9c82c1a9f0f1 sample.pdf e061f37ec0d2d64e74675287a9d93f22d7a4090193f60f1fdc5b9961f34b0f43 sample.txt da0429d51bb6a11c3154c0d04a5fc3a6dcd902882e6ac9aa24532e1cebcc965c sample.zip
正常场景上传后哈希(与原始完全一致)
以下三种场景的文件哈希值和原始文件完全匹配,这里就不重复粘贴了:
- Chrome + HTTP/1.1 上传结果
- Chrome + HTTP/2 上传结果
- Safari + HTTP/1.1 上传结果
异常场景上传后哈希(Safari + HTTP/2)
所有文件的哈希值都和原始文件完全不同,证明文件已损坏:
872ed65f6143e72eb19a2824937f99f4628bc0a369e6b020e9121976104ed0df sample.HEIC 34d5395731c764c32493b47f38f914700aaaaaf3b7fb0bce237073fdead8b9ec sample.jpg cda31f8111cd5f4910d1af62a3db1a23720e8a434f2f39e71bc68e95b1d0e817 sample.pdf 6b63f7c6c77ad89c783558b7ef99228cb4cebd2308a76fbd71c66f439886f12c sample.txt be9eddc53377cb229e4e78fdc4cd47084fb289e91733ce52e3c9e10a5ea59fdc sample.zip
环境信息
生产环境
- OS: Ubuntu 24.04.2 LTS
- Java: Oracle 21.0.6
- Tomcat: 11.0.9(之前用10.1.28也存在同样问题,升级后未解决)
本地复现环境
我用Spring Boot 3.5.2内嵌Tomcat搭建了最小复现项目,同样能复现问题:
- OS: macOS 15.5
- Java: Oracle 21.0.6
- Tomcat: 10.1.42
核心代码
FileUploadApp.java
@SpringBootApplication @Controller public class FileUploadApp { public static void main(String[] args) { SpringApplication.run(FileUploadApp.class, args); } public static class UploadForm { private MultipartFile file; public MultipartFile getFile() { return file; } public void setFile(MultipartFile file) { this.file = file; } } @GetMapping("/") public String upload() { return "upload"; } @PostMapping("/") public String upload(UploadForm uploadForm) throws IOException { Path dest = Path.of("/tmp", uploadForm.getFile().getOriginalFilename()); uploadForm.getFile().transferTo(dest); return "upload"; } }
upload.html
<form action="/" enctype="multipart/form-data" method="POST"> <input type="file" name="file"/> <input type="submit" title="Submit"/> </form>
application.properties
spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=5MB server.ssl.enabled=true server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=somepassword server.ssl.key-store-type=PKCS12 server.ssl.key-alias=http2-alias server.http2.enabled=true
疑问求助
目前我已经排除了文件大小、文件类型、Tomcat版本(跨大版本测试过)的问题,也确认了只有Safari和HTTP/2组合才会触发这个问题。想请教各位:Tomcat有没有什么我遗漏的HTTP/2相关配置,或者有没有其他可能的排查方向能解决这个文件损坏的问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

