使用 Amazon SDK 跟踪分段上传 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon SDK 跟踪分段上传

可以使用侦听接口跟踪对象上传到 Amazon S3 的进度。高级别分段上传 API 提供了这样的侦听接口,名为 ProgressListener。进度事件将定期发生,并且会通知侦听者已传输的字节。有关分段上传的更多一般信息,请参阅在 Amazon S3 中使用分段上传来上传和复制对象

有关使用分段上传以及额外的校验和来上传对象的端到端过程,请参阅教程:通过分段上传来上传对象并验证其数据完整性

下一节介绍如何通过 Amazon SDK 跟踪分段上传。

Java

以下 Java 代码将上传文件并使用 ExecutionInterceptor 来跟踪上传进度。有关如何创建和测试有效示例的说明,请参阅《适用于 Java 的 Amazon SDK 2.x Developer Guide》中的 Getting Started

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

以下 C# 示例使用 TransferUtility 类将文件上传到 S3 存储桶并跟踪上传的进度。有关设置和运行代码示例的信息,请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》中的适用于 .NET 的 Amazon SDK 入门

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); } } }