0

我想使用 AWS Java SDK v2 将目录上传到 S3。

例如,我将如何实现以下功能?

fun uploadDirectory(bucket: String, prefix: String, directory: Path)

我希望在 S3directory上复制的内容。s3://bucket/prefix/

v2 SDK 文档有一个上传单个对象的示例,但似乎没有与 v1 中的上传目录示例等效的示例。

4

2 回答 2

1

您可以使用以下策略来实现它:

  1. 用于Files.walk遍历目录,识别所有文件。
  2. 使用 SDK 异步上传文件,通过S3AsyncClient.putObject.
  3. 用于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)
}
于 2021-09-04T06:17:30.890 回答
0

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 更改日志。

于 2021-08-27T13:40:18.940 回答