【问题标题】:Java multipart upload to s3Java分段上传到s3
【发布时间】:2019-01-10 11:51:59
【问题描述】:

我的方法接收缓冲读取器并转换文件中的每一行。但是,我需要将此转换的输出上传到 s3 存储桶。这些文件非常大,所以我希望能够将我的上传流式传输到 s3 对象中。

为此,我认为我需要使用分段上传,但我不确定我是否正确使用它,因为似乎没有上传任何内容。

这是我的方法:

public void transform(BufferedReader reader)
{
        Scanner scanner = new Scanner(reader);
        String row;
        List<PartETag> partETags = new ArrayList<>();

        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("output-bucket", "test.log");
        InitiateMultipartUploadResult result = amazonS3.initiateMultipartUpload(request);

        while (scanner.hasNext()) {
            row = scanner.nextLine();

            InputStream inputStream = new ByteArrayInputStream(row.getBytes(Charset.forName("UTF-8")));

            log.info(result.getUploadId());

            UploadPartRequest uploadRequest = new UploadPartRequest()
                    .withBucketName("output-bucket")
                    .withKey("test.log")
                    .withUploadId(result.getUploadId())
                    .withInputStream(inputStream)
                    .withPartNumber(1)
                    .withPartSize(5 * 1024 * 1024);

            partETags.add(amazonS3.uploadPart(uploadRequest).getPartETag());
        }

        log.info(result.getUploadId());

        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(
                "output-bucket",
                "test.log",
                result.getUploadId(),
                partETags);

        amazonS3.completeMultipartUpload(compRequest);
}

【问题讨论】:

  • 也许您从阅读 AWS 文档开始?
  • 我做到了,但我只能找到使用输入流而不是输出流的分段上传的示例。

标签: java amazon-s3 buffer java.util.scanner multipart


【解决方案1】:

哦,我明白了。 InitiateMultipartUploadRequest 需要从输入流中读取。这是一个有效的约束,因为您通常只能写入输出流。

您可能听说过可以将数据从 InputStream 复制到 ByteArrayOutputStream。然后获取生成的字节数组并创建一个 ByteArrayInputStream。您可以将此提供给您的请求对象。但是:所有数据都会在某个时间出现在一个字节数组中。由于您的用例是关于大文件的,所以这不可能。

您需要创建一个自定义输入流类,将原始输入流转换为另一个输入流。它要求您处理字节级别的抽象。然而,它会提供最佳性能。如果您想了解更多信息,我建议您提出一个新问题。

您的转换代码已经完成,您不想再次触摸它吗?还有另一种方法。您也可以使用管道将输出流“连接”到输入流:https://howtodoinjava.com/java/io/convert-outputstream-to-inputstream-example/。问题:您在这里处理的是多线程

猜你喜欢
  • 2013-03-29
  • 2017-08-23
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多