Java多部分上传至S3

3

我的方法接收一个缓冲读取器,并转换文件中的每一行。然而,我需要将这个转换的输出上传到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文档? - Mick
1
我找过了,但是我只能找到使用输入流而不是输出流的多部分上传示例。 - Freid001
1个回答

0

哦,我明白了。 InitiateMultipartUploadRequest 需要从输入流读取数据。这是一个有效的约束条件,因为通常情况下只能向输出流写入数据。

你可能听说过可以将数据从 InputStream 复制到 ByteArrayOutputStream,然后获取生成的字节数组并创建一个 ByteArrayInputStream。然后将其提供给请求对象。但所有的数据都将在某个时刻以一个字节数组的形式存在。由于您的用例涉及大文件,这是不可行的。

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

你已经完成了转换代码,不想再碰它了吗?还有另一种方法。你可以使用管道来“连接”输出流和输入流:https://howtodoinjava.com/java/io/convert-outputstream-to-inputstream-example/。但要注意,这里涉及到多线程的问题。


1
https://stackoverflow.com/questions/54134430/create-a-custom-input-stream-to-transform-data - Freid001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接