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

本文讨论了如何使用Java处理Amazon S3的分段上传,特别是在内容长度未知的情况下,避免内存不足的问题。内容中展示了如何利用PipedOutputStream和PipedInputStream配合线程进行分段上传,并详细解释了上传过程中的关键步骤,包括初始化上传、读取输入流、分块上传和完成上传。
摘要由CSDN通过智能技术生成

如果内容长度未知,则AmazonS3Client和TransferManager缓冲内存中的内容,这会导致内存不足异常。

所以我想用分段上传(低级别的API)。

但是我没有找到用inputstream上传的方法(例子中有File)。

我试着通过输入流而没有结果。

我的代码::(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 partETags = new ArrayList();

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;

}.withInputStream(is)

here I'm passing original stream or do i need to create a temp stream

with read content.

提前致谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值