追加上传指的是使用OSS API中的AppendObject在已上传的Appendable Object类型文件后直接追加内容。
注意事项
- 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
- 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见新建OSSClient。
- 要追加上传,您必须有
oss:PutObject
权限。具体操作,请参见为RAM用户授权自定义的权限策略。 - 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。
- 当文件已存在时:
- 如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容。
- 如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常。
- 如果文件为非追加类型文件时,例如通过简单上传的文件类型为Normal的文件,则抛出ObjectNotAppendable异常。
- 追加类型文件暂不支持CopyObject操作。
示例代码
以下代码用于追加上传文件。
OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];
// 配置以下必填字段,其中bucketName为存储空间名称;objectKey等同于objectName,表示追加上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
append.bucketName = @"<bucketName>";
append.objectKey = @"<objectKey>";
// 指定首次进行追加上传的位置。
append.appendPosition = 0;
NSString * docDir = [self getDocumentDirectory];
append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
// 以下为可选字段。
append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// append.contentType = @"";
// append.contentMd5 = @"";
// append.contentEncoding = @"";
// append.contentDisposition = @"";
OSSTask * appendTask = [client appendObject:append];
[appendTask continueWithBlock:^id(OSSTask *task) {
NSLog(@"objectKey: %@", append.objectKey);
if (!task.error) {
NSLog(@"append object success!");
OSSAppendObjectResult * result = task.result;
NSString * etag = result.eTag;
long nextPosition = result.xOssNextAppendPosition;
} else {
NSLog(@"append object failed, error: %@" , task.error);
}
return nil;
}];
相关文档
关于追加上传的API接口说明,请参见AppendObject。