Soto S3 传输

使上传和下载文件到 AWS S3 变得容易。

设置

Soto S3 传输使用 Soto Swift SDK for AWS。在使用 S3 传输管理器之前,您需要创建一个 Soto S3 服务对象。请参阅 Soto 文档 以获得更多指导。您还需要提供 threadPoolProvider 参数,该参数指示 Soto S3 传输将从哪里获取线程来运行文件加载和保存。

let client = AWSClient()
let s3 = S3(client: client, region: .euwest1)
let s3FileTransfer = S3FileTransferManager(s3: s3)

上传到 S3

上传文件到 S3 只需一个调用即可完成。

try await s3FileTransfer.copy(
    from: "/Users/me/images/test.jpg", 
    to: S3File(url: "s3://my-bucket/test.jpg")!
)

您也可以按如下方式上传文件夹

try await s3FileTransfer.copy(
    from: "/Users/me/images/", 
    to: S3Folder(url: "s3://my-bucket/images/")!
)

如果您正在上传文件夹,多个文件将并行上传。并发运行的上传任务数默认为 4,但您可以通过在提供给 S3FileTransferManager 初始化 的 Configuration 中设置 maxConcurrentTasks 来控制此数量。

let s3Transfer = S3FileTransferManager(
    s3: s3, 
    configuration: .init(maxConcurrentTasks: 8)
)

从 S3 下载

下载和上传一样简单,只需交换参数即可

try await s3FileTransfer.copy(
    from: S3File(url: "s3://my-bucket/test.jpg")!, 
    to: "/Users/me/images/test.jpg"
)
try await s3FileTransfer.copy(
    from: S3Folder(url: "s3://my-bucket/images/")!, 
    to: "/Users/me/downloads/images/"
)

从一个 S3 存储桶复制到另一个

您还可以通过提供两个 S3Files 或两个 S3Folders 从一个 S3 存储桶复制到另一个。

try await s3FileTransfer.copy(
    from: S3File(url: "s3://my-bucket/test2.jpg")!, 
    to: S3File(url: "s3://my-bucket/test.jpg")!
)
try await s3FileTransfer.copy(
    from: S3Folder(url: "s3://my-bucket/images/")!, 
    to: S3Folder(url: "s3://my-other-bucket/images/")!)
)

同步操作

这些操作也有 sync 版本。这将仅在文件比现有文件更新时才复制文件。您还可以使其删除目标文件夹中在源文件夹中不存在的文件。

try await s3FileTransfer.sync(
    from: "/Users/me/images/", 
    to: S3Folder(url: "s3://my-bucket/images")!,
    delete: true
)
try await s3FileTransfer.sync(
    from: S3Folder(url: "s3://my-bucket/images")!, 
    to: "/Users/me/downloads/images/",
    delete: false
)

分段上传

如果上传的文件大小超过某个阈值,则传输管理器将使用分段上传将文件上传到 S3。您可以通过在管理器初始化时提供配置来控制此阈值和分段大小。如果您不提供配置,则这两个值都将设置为 8MB。

let s3Transfer = S3FileTransferManager(
    s3: s3, 
    configuration: .init(multipartThreshold: 16*1024*1024, multipartPartSize: 16*1024*1024)
)