如果内容长度未知,则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.
提前致谢。