我想使用 AWS Java SDK v2 将目录上传到 S3。
例如,我将如何实现以下功能?
fun uploadDirectory(bucket: String, prefix: String, directory: Path)
我希望在 S3directory
上复制的内容。s3://bucket/prefix/
v2 SDK 文档有一个上传单个对象的示例,但似乎没有与 v1 中的上传目录示例等效的示例。
我想使用 AWS Java SDK v2 将目录上传到 S3。
例如,我将如何实现以下功能?
fun uploadDirectory(bucket: String, prefix: String, directory: Path)
我希望在 S3directory
上复制的内容。s3://bucket/prefix/
v2 SDK 文档有一个上传单个对象的示例,但似乎没有与 v1 中的上传目录示例等效的示例。
您可以使用以下策略来实现它:
Files.walk
遍历目录,识别所有文件。S3AsyncClient.putObject
.CompletableFuture.allOf
合并所有上传任务,等待完成。此策略使用异步客户端的 50 个线程的默认线程池。对于包含数千个文件的目录,这对我来说效果很好。
这里s3Prefix
是添加到每个上传到存储桶的对象的前缀,相当于目标目录。
fun uploadDirectory(s3Bucket: String, s3Prefix: String, directory: Path) {
require(directory.isDirectory())
Files.walk(directory).use { stream ->
stream.asSequence()
.filter { it.isRegularFile() }
.map { path ->
putObject(
s3Bucket = s3Bucket,
s3Key = "$s3Prefix/${directory.relativize(path)}",
path = path
)
}
.toList().toTypedArray()
}.let { CompletableFuture.allOf(*it) }.join()
}
private fun putObject(s3Bucket: String, s3Key: String, path: Path)
: CompletableFuture<PutObjectResponse> {
val request = PutObjectRequest.builder()
.bucket(s3Bucket)
.key(s3Key)
.build()
return s3AsyncClient.putObject(request, path)
}
TransferManager
与其他一些高级库一起在 v2 中尚不可用。因此,您将不得不使用迁移指南中的 v1
高级库(例如 Amazon S3 Transfer Manager 和 Amazon SQS 客户端缓冲)在 2.x 版中尚不可用。有关库的完整列表,请参阅 AWS SDK for Java 2.x 更改日志。
如果您的应用程序依赖于这些库,请参阅同时使用这两个 SDK 以了解如何配置您的 pom.xml 以同时使用 1.x 和 2.x。有关这些库的更新,请参阅 AWS SDK for Java 2.x 更改日志。