带有输入流和输入流长度的 JAVA AWS S3 分段上传未知

Sri*_*ram 5 java upload amazon-s3 vaadin


如果内容长度未知,则 AmazonS3Client 和 TransferManager 将内容缓存在内存中,导致内存不足异常。
所以我想使用分段上传(低级 API)。但是我没有找到使用输入流上传的方法(示例在文件中)。
我尝试通过输入流但没有结果。

我的代码 ::(在 Vaadin 上传接收器中)

@Override
public OutputStream receiveUpload(final String filename, String mimeType) {
    this.fileName=filename;
    PipedOutputStream pos=null;
    try {
        pos= new PipedOutputStream();
        final InputStream is = new PipedInputStream(pos);
        new Thread(){
            @Override
            public void run(){
                try{
                    List<PartETag> partETags = new ArrayList<PartETag>();
                    InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(
                                                                        bucketName, filename);
                    InitiateMultipartUploadResult initResponse = 
                                                  s3.initiateMultipartUpload(initRequest);
                    long partSize = 5 * 1024 * 1024; // Set part size to 5 MB.
                    int size = 1024;
                    byte[] buffer = new byte[size];
                    int len=0;
                    int partNum = 1;
                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    for(int i=1;(len=is.read(buffer,0,size))!=-1;i++){
                        bos.write(buffer,0,len); 
                        if(bos.size()>=partSize){
                            UploadPartRequest uploadRequest = new UploadPartRequest()
                            .withBucketName(bucketName).withKey(filename)
                            .withUploadId(initResponse.getUploadId()).withPartNumber(partNum++)
                            .withInputStream(is)
                            .withPartSize(partSize);
                             partETags.add(
                                        s3.uploadPart(uploadRequest).getPartETag());
                            bos.flush();
                            bos.close();
                            ins.close();
                            bos = new ByteArrayOutputStream();
                        }
                    }
                    //rest of data, written to s3
                    System.out.println("After remaining bos "+bos.size());
                    UploadPartRequest uploadRequest = new UploadPartRequest()
                    .withBucketName(bucketName).withKey(filename)
                    .withUploadId(initResponse.getUploadId()).withPartNumber(partNum++)
                    .withInputStream(is)
                    .withLastPart(true);
                    partETags.add(
                            s3.uploadPart(uploadRequest).getPartETag());

                    CompleteMultipartUploadRequest compRequest = new 
                                 CompleteMultipartUploadRequest(
                                            bucketName, 
                                            filename, 
                                            initResponse.getUploadId(), 
                                            partETags);

                    s3.completeMultipartUpload(compRequest);
            }
        }.start();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return pos;
}
Run Code Online (Sandbox Code Playgroud)

.withInputStream(is)
在这里我传递原始流还是我需要创建一个包含读取内容的临时流。

提前致谢。