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

Quarkus多部分上传时XLSX/图片文件体积增40%且损坏求助

Quarkus 3.10.2上传Excel/图片文件损坏问题

关键症状

  • 文件上传流程无报错,看似成功
  • 保存后的.xlsx文件无法被Excel正常读取,提示“我们发现部分内容存在问题”
  • 损坏文件体积比原文件增大30%-40%(例如100KB变为140KB)
  • 图片文件上传后同样损坏,但文本、PDF文件不受影响

使用环境

  • Quarkus版本:3.10.2
  • Java版本:Amazon Corretto 17
  • 操作系统:Windows 11、Linux(均出现该问题)
  • 存储方式:本地文件系统(ext4/NTFS)

上传代码

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadExcel(@RestForm("file") FileUpload file) throws IOException {
    Path dest = Path.of("uploads", file.fileName());
    
    // DEBUG: 记录文件大小
    System.out.printf("原文件大小: %d bytes | 接收文件大小: %d bytes%n",
        file.size(),
        Files.size(file.uploadedFile()));
    
    Files.copy(file.uploadedFile(), dest, StandardCopyOption.REPLACE_EXISTING);
    
    return Response.ok().build();
}

问题原因与修复方案

原因

问题根源是Quarkus的RESTEasy Reactive在处理二进制文件的多部分上传时,错误地将二进制数据以文本编码(如UTF-8)解析后再写入,导致二进制字节被篡改。Excel、图片这类纯二进制文件对字节变化高度敏感,因此出现损坏;而文本、PDF文件的编码与处理时的编码兼容,所以不受影响。

修复方案

方案1:改用InputStream直接处理文件流

避免依赖FileUpload的中间文件处理,直接通过InputStream读取原始二进制数据并写入目标路径:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadExcel(@RestForm("file") InputStream fileInputStream,
                            @RestForm("file") FormDataContentDisposition fileDisposition) throws IOException {
    String fileName = fileDisposition.getFileName();
    Path dest = Path.of("uploads", fileName);
    
    try (fileInputStream) {
        Files.copy(fileInputStream, dest, StandardCopyOption.REPLACE_EXISTING);
    }
    
    return Response.ok().build();
}

方案2:配置Quarkus强制二进制文件处理

如果仍想使用FileUpload,在application.properties中添加以下配置,强制多部分处理以二进制流方式处理文件:

quarkus.resteasy-reactive.multipart.binary-file-handling=STREAM

内容的提问来源于stack exchange,提问作者Dheeban M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:07:37