繁体   English   中英

Java分段上传到S3

[英]Java multipart upload to s3

我的方法接收一个缓冲的阅读器,并转换文件中的每一行。 但是,我需要将此转换的输出上载到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);
}

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

您可能听说过可以将数据从InputStream复制到ByteArrayOutputStream 然后获取结果字节数组并创建一个ByteArrayInputStream 您可以将其提供给您的请求对象。 但是: 所有数据将在特定时间以一个字节数组的形式显示。 由于您的用例是关于大文件的,所以这不可能

您需要创建一个自定义输入流类,该类将原始输入流转换为另一个输入流。 它要求您进行字节级抽象。 但是,它将提供最佳性能 我建议您提出一个新问题,如果您想进一步了解这一点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM