报错如图:
Service: Amazon S3; Status Code: 400; Error Code: EntityTooSmall;
分段上传方法如下:
public static CompleteMultipartUploadResult uploadFileByFileNext(String object_key, File part_file, List<String> errorMsg){
//初始化分段上传UploadPartRequest对象
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucket_name, object_key);
InitiateMultipartUploadResult initResponse = amazonS3Client.initiateMultipartUpload(initRequest);//
String s3_multi_uploadid = initResponse.getUploadId();
List<PartETag> partETags = new ArrayList<PartETag>();
long filePosition = 0;
try {
for (int i = 1; filePosition < part_file.length(); i++) {
partSize = Math.min(partSize, (part_file.length() - filePosition));
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket_name)
.withKey(object_key)
.withUploadId(initResponse.getUploadId())
.withPartNumber(i)
.withFileOffset(filePosition)
.withFile(part_file)
.withPartSize(partSize)
.withLastPart(partSize + filePosition == part_file.length());
//上传对象
UploadPartResult uploadResult = amazonS3Client.uploadPart(uploadRequest);
partETags.add(uploadResult.getPartETag());//
filePosition += partSize;
}
CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucket_name, object_key,
initResponse.getUploadId(), partETags);
CompleteMultipartUploadResult completeMultipartUploadResult = amazonS3Client.completeMultipartUpload(compRequest);//
return completeMultipartUploadResult;
}catch (Exception e) {
logger.error(e.getMessage());
errorMsg.add(e.getMessage());
amazonS3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
bucket_name, object_key, s3_multi_uploadid));
}
return null;
}
先说报错原因,因方法uploadFileByFileNext处在一个循环里,而方法里的partSize是静态变量
static long partSize = 5 * 1024 * 1024;//5M
循环的时候,第一个文件处理完成后,没有置位,partSize小于5M了,所以报错。官网文档要求分块不能小于5M,最后一块除外。下面是文档
修改后:
将partsize每次进入方法时,置位即可。