Amazon S3 Transfer Manager |
您所在的位置:网站首页 › java文件上传进度条 › Amazon S3 Transfer Manager |
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。 Amazon S3 Transfer ManagerAmazon S3 Transfer Manager 是一款开源的高级文件传输工具,用于AWS SDK for Java 2.x。使用它来往亚马逊简单存储服务 (Amazon S3) 和从亚马逊简单存储服务 (Amazon S3) 传输文件和目录。 在的基础上构建时AWS基于CRT的S3客户端,S3 传输管理器可以利用性能改进,例如分段上传 API 和字节范围提取。 使用 S3 传输管理器,您还可以实时监控传输进度,并暂停传输以备日后执行。 开始使用 将依赖项添加到您的构建文件中要使用基于基于 AWS CRT 的 S3 客户端的性能增强的 S3 传输管理器,请使用以下依赖项配置您的构建文件。 使用适用于 Java 的 SDK 2.19.1 或更高版本 2. x。 将s3-transfer-manager构件添加为依赖项。 在 0.20.3 或更高版本中将aws-crt构件作为依赖项添加。 以下代码示例显示了如何为 Maven 配置项目依赖关系。 2.19.1 software.amazon.awssdk bom ${aws.sdk.version} pom import software.amazon.awssdk s3-transfer-manager software.amazon.awssdk.crt aws-crt 0.20.3在 Maven 中央存储库中搜索 s3-transfer-Manager 和 aws- crt 工件的最新版本。 创建 S3 传输管理器的实例以下代码段显示了如何使用默认设置创建 S3 TransferManager 实例。 S3TransferManager transferManager = S3TransferManager.create();以下示例说明如何使用自定义设置配置 S3 传输管理器。在此示例中,AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端。 S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build(); 注意如果构建文件中未包含aws-crt依赖关系,则 S3 传输管理器将在适用于 Java 的 SDK 2.x 中使用的标准 S3 异步客户端的基础上构建。 将文件上传到 S3 存储桶要使用 S3 传输管理器将文件上传到 Amazon S3,请将UploadFileRequest对象传递给S3TransferManager的 uploadFile 方法。 从该uploadFile方法返回的FileUpload对象表示上传过程。请求完成后,该CompletedFileUpload对象将包含有关上传的信息。 以下示例显示了文件上传示例 LoggingTransferListener,以及记录上传进度的可选用法。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.net.URL; import java.nio.file.Paths; import java.util.UUID; public String uploadFile(S3TransferManager transferManager, String bucketName, String key, String filePath) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) .source(Paths.get(filePath)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); return uploadResult.response().eTag(); } 从 S3 存储桶下载文件要使用 S3 传输管理器从 S3 存储桶下载对象,请生成一个DownloadFileRequest对象并将其传递给 downloadFile 方法。 的downloadFile方法返回S3TransferManager的FileDownload对象表示文件传输。下载完成后,CompletedFileDownload包含对下载相关信息的访问权限。 以下示例还显示了下载示例以及记录下载进度的可选用法。LoggingTransferListener import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload; import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest; import software.amazon.awssdk.transfer.s3.model.FileDownload; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.UUID; public Long downloadFile(S3TransferManager transferManager, String bucketName, String key, String downloadedFileWithPath) { DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) .destination(Paths.get(downloadedFileWithPath)) .build(); FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); logger.info("Content length [{}]", downloadResult.response().contentLength()); return downloadResult.response().contentLength(); } 将 Amazon S3 对象复制到另一个存储桶要开始将对象从 S3 存储桶复制到另一个存储桶,请创建一个基本CopyObjectRequest实例。 接下来,将基本内容封装CopyObjectRequest在 S3 传输管理器可以使用的文件中。CopyRequest 的copy方法返回S3TransferManager的Copy对象表示复制过程。复制过程完成后,该CompletedCopy对象将包含有关响应的详细信息。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.CopyObjectRequest; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedCopy; import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; import java.util.UUID; public String copyObject(S3TransferManager transferManager, String bucketName, String key, String destinationBucket, String destinationKey){ CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder() .sourceBucket(bucketName) .sourceKey(key) .destinationBucket(destinationBucket) .destinationKey(destinationKey) .build(); CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(copyObjectRequest) .build(); Copy copy = transferManager.copy(copyRequest); CompletedCopy completedCopy = copy.completionFuture().join(); return completedCopy.response().copyObjectResult().eTag(); } 注意目前不支持跨区域复制。 将本地目录上传到 S3 存储桶要将本地目录上传到 S3 存储桶,请首先调用S3TransferManager实例的 uploadDirectory 方法,然后传入。UploadDirectoryRequest 该DirectoryUpload对象表示上传过程,该过程会在请求完成CompletedDirectoryUpload时生成。该CompleteDirectoryUpload对象包含有关传输结果的信息,包括哪些文件传输失败。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryUpload; import software.amazon.awssdk.transfer.s3.model.DirectoryUpload; import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest; import java.net.URL; import java.nio.file.Paths; import java.util.UUID; public Integer uploadDirectory(S3TransferManager transferManager, String sourceDirectory, String bucketName){ DirectoryUpload directoryUpload = transferManager.uploadDirectory(UploadDirectoryRequest.builder() .source(Paths.get(sourceDirectory)) .bucket(bucketName) .build()); CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join(); completedDirectoryUpload.failedTransfers().forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryUpload.failedTransfers().size(); } 将 S3 存储桶对象下载到本地目录要将 S3 存储桶中的对象下载到本地目录,请首先调用传输管理器的 downloadDirectory 方法,传入。DownloadDirectoryRequest 该DirectoryDownload对象表示下载过程,该过程会在请求完成CompletedDirectoryDownload时生成。该CompleteDirectoryDownload对象包含有关传输结果的信息,包括哪些文件传输失败。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; public Integer downloadObjectsToDirectory(S3TransferManager transferManager, String destinationPath, String bucketName) { DirectoryDownload directoryDownload = transferManager.downloadDirectory(DownloadDirectoryRequest.builder() .destination(Paths.get(destinationPath)) .bucket(bucketName) .build()); CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join(); completedDirectoryDownload.failedTransfers().forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryDownload.failedTransfers().size(); } |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |