java - 如何将二进制/八位字节流 s3 内容保存/压缩为 zip

标签 java spring-boot amazon-s3

我正在尝试将 s3 存储桶文件添加到 zip 中。 s3存储桶中的文件采用二进制/八位字节流格式。

当我运行以下方法时

 public static void addFileToZip(ZipOutputStream zip, String fileName, InputStream fileContent) throws IOException {
    try {
      zip.putNextEntry(new ZipEntry(fileName));
      IOUtils.copy(fileContent, zip);
      zip.closeEntry();
    } catch (IOException ioe) {
      fileContent.close();
    }
  }
}

执行IOUtils.copy方法时抛出下面的IO异常

“异常”:“内容长度分隔的消息正文过早结束(预期:206,034;收到:0)”

关于如何处理这个问题或者我做错了什么有什么建议吗? 谢谢。

编辑:- @LeeGreiner 我得到这样的输入流:

public ResponseInputStream<GetObjectResponse> getObject(String key) {
    try (S3Client s3 = s3Client.getClient()) {
      return s3.getObject(
          GetObjectRequest.builder()
              .bucket(bucketName)
              .key(key)
              .build()
      );
    }
  }

最佳答案

您可以使用 ResponseTransformer将响应转换为输入流:

s3.getObject(getObjectRequest, ResponseTransformer.toInputStream());

我的具体方法如下(假设s3连接已经创建):

public static InputStream getObject(String key) throws IOException {

    GetObjectRequest getObjectRequest = GetObjectRequest.builder()
            .bucket(bucketName)
            .key(key)
            .build();

    return s3.getObject(getObjectRequest, ResponseTransformer.toInputStream());
}

然后可以按照通常的方式将生成的输入流添加到您的 zip 文件中。

关于java - 如何将二进制/八位字节流 s3 内容保存/压缩为 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69682181/

相关文章:

java - 如何自动将数据从 amazon S3 复制到 redshift?

amazon-web-services - 如何使用lambda将s3中的最新代码部署到lambda函数

angularjs - 如何检索oracle sql查询的进度?

java - 由 : org. flywaydb.core.api.FlywayException : Validate failed. 迁移校验和不匹配导致迁移 2

java - 根据实体中集合的大小对结果集进行排序

android - 403 禁止。我们计算的请求签名与您提供的签名不匹配。检查从 Android 到 Amazon S3 的 key 和签名方法

java - 在 libgdx 中截图

java - 泛型有界参数不适用于接口(interface)

java - 查询C3P0启动时获取的连接数

java - 如何使用 Eclipse AST 以编程方式创建文字