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)
在这里我传递原始流还是我需要创建一个包含读取内容的临时流。
提前致谢。