Problems when uploading large files to Amazon S3

后端 未结 5 934
闹比i
闹比i 2020-12-24 14:41

I tried to use Amazon-SDK(Java) sample code S3TransferProgressSample.java to upload large files to Amazon-S3 storage (also posted here on AWS docs).

But

5条回答
  •  -上瘾入骨i
    2020-12-24 15:44

    Try using the low level API.

    This will give you far more control when things go wrong, as they are likely to do with an 11GB file.

    Requests to and from S3 do fail from time to time. With the low level API, you'll be able to retry a part of the upload if it fails.

    Refactoring the example in the Amazon docs a bit:

    // Step 2: Upload parts.
    long filePosition = 0;
    for (int i = 1; filePosition < contentLength; i++) {
        // Last part can be less than 5 MB. Adjust part size.
        partSize = Math.min(partSize, (contentLength - filePosition));
    
        // Create request to upload a part.
        UploadPartRequest uploadRequest = new UploadPartRequest()
                    .withBucketName(existingBucketName).withKey(keyName)
                    .withUploadId(initResponse.getUploadId()).withPartNumber(i)
                    .withFileOffset(filePosition)
                    .withFile(file)
                    .withPartSize(partSize);
    
        // repeat the upload until it succeeds.
        boolean anotherPass;  
            do {
                  anotherPass = false;  // assume everythings ok
                  try {
                      // Upload part and add response to our list.
                      partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
                  } catch (Exception e) {
                        anotherPass = true; // repeat
                  }
            } while (anotherPass);
    
         filePosition += partSize;
    }
    
       // Step 3: complete.
       CompleteMultipartUploadRequest compRequest = new 
                         CompleteMultipartUploadRequest(
                                    existingBucketName, 
                                    keyName, 
                                    initResponse.getUploadId(), 
                                    partETags);
    
       s3Client.completeMultipartUpload(compRequest);
    

    Note: I am not a java developer so I could have messed things up syntactically, but hopefully this gets you going in the right direction. Also, you'll want to add in a 'retry counter' to prevent an endless loop if the upload repeatedly fails.

提交回复
热议问题