【问题标题】:How to save/zip binary/octet-stream s3 content to zip如何将二进制/八位字节流 s3 内容保存/压缩到 zip
【发布时间】:2021-12-09 09:52:11
【问题描述】:

我正在尝试将 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异常

"exception": "Content-Length 分隔的消息体过早结束(预期:206,034;收到:0)"

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

编辑:- @LeeGreiner 我得到这样的 InputStream:

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

【问题讨论】:

  • 你能说明你是如何将 InputStream 传递给这个方法的吗?你用的是S3Object.getObjectContent(),对象是bucket还是bucket中的文件?
  • @LeeGreiner 我已在问题中添加为编辑,它是存储桶中的文件。

标签: java spring-boot amazon-s3


【解决方案1】:

您可以使用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 文件中。

【讨论】:

  • 谢谢你,安德鲁!这解决了我的问题。快速提问,我注意到当我删除 try-with-resources 语句以获取 S3client 时,我的方法也有效。你有可能知道为什么会这样吗?谢谢。
  • 我假设您的 try-with-resource 代码将在每个 getObject() 方法调用结束时自动关闭 s3 客户端。我的示例代码在这方面实际上很差 - 为了清楚起见,我删除了该代码。我认为最好的方法是client lifecycle 文档中概述的方法:将客户端视为一个长期存在的对象,并在您不再需要它时显式调用s3.close()。使用您的方法,您会反复打开和关闭它 - 可能是不必要的。
  • 感谢您的澄清。这是有道理的。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多