使上传和下载文件到 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 只需一个调用即可完成。
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)
)
下载和上传一样简单,只需交换参数即可
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/"
)
您还可以通过提供两个 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)
)