java - 无法打开使用 spring-boot 下载的 S3 zip 文件

标签 java spring-boot amazon-s3

我的 AWS S3 包含一些文件,我想通过我的应用程序将这些文件下载为 zip 文件。我能够成功下载 zip 文件,但在下载文件时出现错误意外的存档结束,并且 zip 内的 CSV 文件大小为 0。

我确实进行了很多挖掘,但无法理解确切的解决方案。

代码如下:

String zipFileName = "MyZipFile.zip";

String fileName = "test.csv";

filePath = new String(Base64.getDecoder().decode(filePath));
System.out.println("file:" + filePath);

// get file from S3
S3Object s3Obj = awsClient.downloadFile(filePath);

byte[] s3Bytes = s3Obj.getObjectContent().readAllBytes();

// create zip
ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream(s3Bytes.length);
ZipOutputStream zipOutStream = new ZipOutputStream(byteArrOutputStream);
ZipEntry zip = new ZipEntry(fileName);
zipOutStream.putNextEntry(zip);
zipOutStream.write(s3Bytes, 0, s3Bytes.length);
byte[] streamBytes = byteArrOutputStream.toByteArray();

// close streams
zipOutStream.closeEntry();
zipOutStream.close();
closeQuietly(byteArrOutputStream);

// prepare download
System.out.println("streamBytes:" + streamBytes + " len:" + streamBytes.length);
System.out.println("s3Bytes:" + s3Bytes + " len:" + s3Bytes.length);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentLength(streamBytes.length);
headers.setContentDispositionFormData("attachment", zipFileName);

最佳答案

我认为您应该关闭 zip 输出流,以便在提取字节数组之前将所有内容写入底层字节数组流...即将行重新排序为:

// close streams
zipOutStream.closeEntry();
zipOutStream.close();
byte[] streamBytes = byteArrOutputStream.toByteArray();
closeQuietly(byteArrOutputStream);

关于java - 无法打开使用 spring-boot 下载的 S3 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409645/

相关文章:

java - 在工厂类中使用字段/变量,以便在通过工厂创建的对象之间使用

java - Shiro session 集群与 Hazelcast,而不是在 Web 上

java - 如何实时获取executor的队列大小

python - 如何将base64编码的字符串上传到s3并在python中访问html文件中的url

java - Java 猜谜游戏

java - 构造函数错误(JAVA)

spring - spring boot : Encoded password does not look like BCrypt中的登录错误

java - 让一个 Spring bean 继承另一个 Spring bean 是一种好的做法吗?

node.js - 使用 ExpressJS 将文件上传到 S3,同时限制文件大小

hadoop - 带有Iceberg和S3的独立配置单元metastore