追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。
使用限制
通过追加上传的方式上传文件时,有如下限制:
- 如果文件不存在,则调用AppendObject接口会创建一个可追加类型的文件。
- 如果文件已存在,且为可追加类型文件时,若设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。如果文件已存在,且为不可追加类型文件时,则抛出ObjectNotAppendable异常。
- 追加类型的文件暂不支持CopyObject操作。
有关追加上传的更多信息,请参见AppendObject。
示例代码
以下代码用于追加上传文件:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS账号信息。*/
/* 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/* Endpoint以杭州为例,其它Region请按实际情况填写。
std::string Endpoint = "yourEndpoint";
/* 设置Bucket名称。*/
std::string BucketName = "yourBucketName";
/* 设置Object名称。即不包含Bucket名称在内的Object的完整路径,例如example/folder/abc.jpg。*/
std::string ObjectName = "yourObjectName";
/* 初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
auto meta = ObjectMetaData();
meta.setContentType("text/plain");
/* 第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。*/
std::shared_ptr<std::iostream> content1 = std::make_shared<std::stringstream>();
*content1 <<"Thank you for using Aliyun Object Storage Service!";
AppendObjectRequest request(BucketName, ObjectName, content1, meta);
request.setPosition(0L);
/* 第一次追加文件。*/
auto result = client.AppendObject(request);
if (!result.isSuccess()) {
/* 异常处理。*/
std::cout << "AppendObject fail" <<
",code:" << result.error().Code() <<
",message:" << result.error().Message() <<
",requestId:" << result.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
std::shared_ptr<std::iostream> content2 = std::make_shared<std::stringstream>();
*content2 <<"Thank you for using Aliyun Object Storage Service!";
auto position = result.result().Length();
AppendObjectRequest appendObjectRequest(BucketName, ObjectName, content2);
appendObjectRequest.setPosition(position);
/* 第二次追加文件。*/
auto outcome = client.AppendObject(appendObjectRequest);
if (!outcome.isSuccess()) {
/* 异常处理。*/
std::cout << "AppendObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/* 释放网络等资源。*/
ShutdownSdk();
return 0;
}
有关Bucket名称命名规范的更多信息,请参见存储空间(Bucket)。有关Object名称命名规范的更多信息,请参见对象(Object)。