代码之家  ›  专栏  ›  技术社区  ›  Freid001

Java多部件上传到S3

  •  0
  • Freid001  · 技术社区  · 6 年前

    我的方法接收一个缓冲的读卡器,并转换文件中的每一行。但是,我需要将这个转换的输出上传到一个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);
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Mick    6 年前

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

    您可能听说可以将数据从inputstream复制到 按earrayOutputstream . 然后获取结果字节数组并创建一个 字节数组输入流 . 您可以将它提供给您的请求对象。但是: 所有数据将在某个时间以一个字节数组的形式出现。 因为您的用例是关于大文件的,所以这不能是好的。

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

    您的转换代码已经完成,您不想再碰它吗?还有另一种方法。您还可以使用 : https://howtodoinjava.com/java/io/convert-outputstream-to-inputstream-example/ . 要点:你正在处理 多执行绪 在这里。