You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:29:30