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
相关产品推荐
相关产品推荐

