Tracking a multipart upload with the Amazon SDKs
You can track an object's upload progress to Amazon S3 with a listen interface. The high-level
multipart upload API provides such a listen interface, called ProgressListener
.
Progress events occur periodically and notify the listener that bytes have been transferred.
For more general information about multipart uploads, see Uploading and copying objects using multipart upload in Amazon S3.
For an end-to-end procedure on uploading an object with multipart upload with an additional checksum, see Tutorial: Upload an object through multipart upload and verify its data integrity.
The following section show how to track a multipart upload with the Amazon SDKs.
- Java
-
Example
The following Java code uploads a file and uses the
ExecutionInterceptor
to track the upload progress. For instructions on how to create and test a working sample, see Getting Started in the Amazon SDK for Java 2.x Developer Guide.import java.nio.file.Paths; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.core.async.AsyncRequestBody; import software.amazon.awssdk.core.interceptor.Context; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.model.PutObjectRequest; public class TrackMPUProgressUsingHighLevelAPI { static class ProgressListener implements ExecutionInterceptor { private long transferredBytes = 0; @Override public void beforeTransmission(Context.BeforeTransmission context, ExecutionAttributes executionAttributes) { if (context.httpRequest().firstMatchingHeader("Content-Length").isPresent()) { String contentLength = context.httpRequest().firstMatchingHeader("Content-Length").get(); long partSize = Long.parseLong(contentLength); transferredBytes += partSize; System.out.println("Transferred bytes: " + transferredBytes); } } } public static void main(String[] args) throws Exception { String existingBucketName = "*** Provide bucket name ***"; String keyName = "*** Provide object key ***"; String filePath = "*** file to upload ***"; S3AsyncClient s3Client = S3AsyncClient.builder() .credentialsProvider(ProfileCredentialsProvider.create()) .overrideConfiguration(c -> c.addExecutionInterceptor(new ProgressListener())) .build(); // For more advanced uploads, you can create a request object // and supply additional request parameters (ex: progress listeners, // canned ACLs, etc.) PutObjectRequest request = PutObjectRequest.builder() .bucket(existingBucketName) .key(keyName) .build(); AsyncRequestBody requestBody = AsyncRequestBody.fromFile(Paths.get(filePath)); // You can ask the upload for its progress, or you can // add a ProgressListener to your request to receive notifications // when bytes are transferred. // S3AsyncClient processes all transfers asynchronously, // so this call will return immediately. var upload = s3Client.putObject(request, requestBody); try { // You can block and wait for the upload to finish upload.join(); } catch (Exception exception) { System.out.println("Unable to upload file, upload aborted."); exception.printStackTrace(); } finally { s3Client.close(); } } }
- .NET
The following C# example uploads a file to an S3 bucket using the
TransferUtility
class, and tracks the progress of the upload. For information about setting up and running the code examples, see Getting Started with the Amazon SDK for .NET in the Amazon SDK for .NET Developer Guide.using Amazon; using Amazon.S3; using Amazon.S3.Transfer; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class TrackMPUUsingHighLevelAPITest { private const string bucketName = "*** provide the bucket name ***"; private const string keyName = "*** provide the name for the uploaded object ***"; private const string filePath = " *** provide the full path name of the file to upload **"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); TrackMPUAsync().Wait(); } private static async Task TrackMPUAsync() { try { var fileTransferUtility = new TransferUtility(s3Client); // Use TransferUtilityUploadRequest to configure options. // In this example we subscribe to an event. var uploadRequest = new TransferUtilityUploadRequest { BucketName = bucketName, FilePath = filePath, Key = keyName }; uploadRequest.UploadProgressEvent += new EventHandler<UploadProgressArgs> (uploadRequest_UploadPartProgressEvent); await fileTransferUtility.UploadAsync(uploadRequest); Console.WriteLine("Upload completed"); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } static void uploadRequest_UploadPartProgressEvent(object sender, UploadProgressArgs e) { // Process event. Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes); } } }