Java 17 SpringBoot下S3中Docx文件改写后重新上传问题
解决Docx4J处理后文档上传S3的问题
方案1:生成临时文件上传
如果你的S3客户端仅支持File类型上传,可以将处理后的WordprocessingMLPackage写入临时文件,完成上传后清理临时文件即可:
// 已完成变量替换的WordprocessingMLPackage实例 WordprocessingMLPackage wordMLPackage = ...; // 创建临时docx文件 File tempDoc = File.createTempFile("temp-processed-", ".docx"); try { // 将Docx4J文档写入临时文件 Docx4J.save(wordMLPackage, tempDoc); // 上传到S3 s3Client.uploadFile(s3TargetFolder, "final-document.docx", tempDoc, bucket); } finally { // 上传完成后删除临时文件,避免磁盘占用 tempDoc.delete(); }
方案2:直接用字节流上传(更高效)
多数S3 SDK其实支持字节数组或InputStream上传(即使你当前的客户端封装只暴露File方法,也可以看看底层是否有其他重载),这种方式无需生成磁盘文件,性能更优:
// 已完成变量替换的WordprocessingMLPackage实例 WordprocessingMLPackage wordMLPackage = ...; // 将文档写入字节数组输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Docx4J.save(wordMLPackage, outputStream); byte[] processedBytes = outputStream.toByteArray(); // 转换为InputStream(如果客户端需要) InputStream inputStream = new ByteArrayInputStream(processedBytes); // 调用S3客户端对应的字节流上传方法(示例) // 比如AWS原生SDK的putObject方法: // s3Client.putObject(bucket, s3TargetFolder + "/final-document.docx", inputStream, new ObjectMetadata());
注意事项
- 临时文件方案中,
delete()方法会立即删除文件,比deleteOnExit()更及时,适合服务器环境。 - 优先选择字节流上传,减少磁盘IO开销,避免临时文件的权限、空间等潜在问题。
内容的提问来源于stack exchange,提问作者Ivan David Muiños
相关产品推荐
相关产品推荐

