Swift追加上传

追加上传是指在已上传的追加类型文件(Appendable Object)末尾直接追加内容。本文介绍如何使用OSS Swift SDK进行追加上传。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 当文件不存在时,调用追加上传接口会创建一个追加类型文件。

  • 当文件已存在时:

    • 如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容。

    • 如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常。

    • 如果文件为非追加类型文件,例如通过简单上传的文件类型为Normal的文件,则抛出ObjectNotAppendable异常。

权限说明

阿里云账号默认拥有全部权限。阿里云账号下的RAM用户或RAM角色默认没有任何权限,需要阿里云账号或账号管理员通过RAM PolicyBucket Policy授予操作权限。

API

Action

说明

AppendObject

oss:PutObject

以追加写的方式上传文件(Object)。

oss:PutObjectTagging

以追加写的方式上传文件(Object)时,如果通过x-oss-tagging指定Object的标签,则需要此操作的权限。

示例代码

以下代码用于追加上传文件。

import AlibabaCloudOSS
import Foundation

@main
struct Main {
    static func main() async {
        do {
            // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
            let region = "cn-hangzhou"
            // 填写Bucket名称。
            let bucket = "yourBucketName"
            // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
            let endpoint: String? = nil
            // 填写对象名称(如:my-object.txt)。
            let key = "yourKey"

            // 从环境变量加载凭证(需提前设置 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
            let credentialsProvider = EnvironmentCredentialsProvider()

            // 配置OSS客户端参数
            let config = Configuration.default()
                .withRegion(region) // 设置区域
                .withCredentialsProvider(credentialsProvider) // 设置凭证
                .withUploadCRC64Validation(false) // 关闭CRC64校验(可选)
                
            // 设置Endpoint
            if let endpoint = endpoint {
                config.withEndpoint(endpoint)
            }

            // 创建OSS客户端实例
            let client = Client(config)

            // 准备分段上传内容
            let content1 = "Hello"
            let content2 = ", OSS!"

            // 第一次追加:从位置0开始写入
            var result = try await client.appendObject(
                AppendObjectRequest(
                    bucket: bucket,
                    key: key,
                    position: 0,
                    body: .data(content1.data(using: .utf8)!)
                )
            )
            print("result:\n\(result)")

            // 第二次追加:从上次结束的位置继续写入
            result = try await client.appendObject(
                AppendObjectRequest(
                    bucket: bucket,
                    key: key,
                    position: result.nextAppendPosition,
                    body: .data(content2.data(using: .utf8)!)
                )
            )
            print("result:\n\(result)")

        } catch {
            // 捕获并处理异常
            print("error:\n\(error)")
        }
    }
}

相关文档

  • 关于追加上传的完整示例代码,请参见GitHub示例

  • 关于追加上传的基础API接口,请参见AppendObject