1+ #include < stdlib.h>
2+ #include < sys/stat.h>
3+ #include < iostream>
4+ #include < map>
5+ #include < string>
6+ #include < thread>
7+ #include < vector>
8+ #include " cos_api.h"
9+ #include " cos_sys_config.h"
10+ #include " util/auth_tool.h"
11+
12+ /* *
13+ * 本样例演示了如何使用 COS C++ SDK 进行对象的复制和移动
14+ * 包括:桶内复制、高级对象复制、桶内移动、用户自行分块复制
15+ */
16+ using namespace qcloud_cos ;
17+
18+ uint64_t appid = 12500000000 ;
19+ std::string tmp_secret_id = " AKIDXXXXXXXX" ;
20+ std::string tmp_secret_key = " 1A2Z3YYYYYYYYYY" ;
21+ std::string region = " ap-guangzhou" ;
22+ std::string bucket_name = " examplebucket-12500000000" ;
23+ std::string tmp_token = " token" ;
24+
25+ /*
26+ * 本方法包含调用是否正常的判断,和请求结果的输出
27+ * 可通过本方法判断是否请求成功,并输出结果信息
28+ */
29+ void PrintResult (const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
30+ if (result.IsSucc ()) {
31+ std::cout << " Request Succ." << std::endl;
32+ std::cout << resp.DebugString () << std::endl;
33+ } else {
34+ std::cout << " ErrorMsg=" << result.GetErrorMsg () << std::endl;
35+ std::cout << " HttpStatus=" << result.GetHttpStatus () << std::endl;
36+ std::cout << " ErrorCode=" << result.GetErrorCode () << std::endl;
37+ std::cout << " ErrorMsg=" << result.GetErrorMsg () << std::endl;
38+ std::cout << " ResourceAddr=" << result.GetResourceAddr () << std::endl;
39+ std::cout << " XCosRequestId=" << result.GetXCosRequestId () << std::endl;
40+ std::cout << " XCosTraceId=" << result.GetXCosTraceId () << std::endl;
41+ }
42+ }
43+
44+ /*
45+ * 通过参数形式初始化 CosAPI 对象
46+ */
47+ qcloud_cos::CosAPI InitCosAPI () {
48+ qcloud_cos::CosConfig config (appid, tmp_secret_id, tmp_secret_key, region);
49+ config.SetTmpToken (tmp_token); // 推荐使用临时密钥初始化 CosAPI 对象, 如果您使用永久密钥初始化 CosAPI 对象,请注释
50+ qcloud_cos::CosAPI cos_tmp (config);
51+ return cos_tmp;
52+ }
53+
54+ /*
55+ * 该 Demo 示范如何拷贝一个对象至当前 CosAPI 指定的存储桶中
56+ * 最大支持拷贝不超过5GB的对象,支持跨区域复制
57+ */
58+ void PutObjectCopyDemo (qcloud_cos::CosAPI& cos) {
59+ std::string object_name = " test_dst.txt" ; // 复制目标对象名称
60+ std::string source = bucket_name + " .cos." + region + " .myqcloud.com/test.txt" ; // 复制源对象
61+ qcloud_cos::PutObjectCopyReq req (bucket_name, object_name);
62+ req.SetXCosCopySource (source);
63+ qcloud_cos::PutObjectCopyResp resp;
64+ qcloud_cos::CosResult result = cos.PutObjectCopy (req, &resp);
65+
66+ std::cout << " ===================PutObjectCopyResponse====================" << std::endl;
67+ PrintResult (result, resp);
68+ std::cout << " ============================================================" << std::endl;
69+ }
70+
71+ /*
72+ * 该 Demo 示范如何使用高级复制接口拷贝对象至当前 CosAPI 指定的存储桶中
73+ * 该接口封装了简单拷贝和分块拷贝,根据文件大小智能的选择拷贝对象的方式
74+ * 支持大对象,支持跨区域复制。推荐调用此接口
75+ * 通过全局可以设置分块拷贝分块大小
76+ */
77+ void CopyDemo (qcloud_cos::CosAPI& cos) {
78+ std::string object_name = " test_dst.txt" ; // 复制后对象名称
79+ std::string source = bucket_name + " .cos." + region + " .myqcloud.com/test_src.txt" ; ; // 复制源对象
80+
81+ // 设置分块拷贝的分块大小,默认20MB,最大支持5GB,最小支持1MB
82+ // 此配置是全局性配置,主动设置后,后续初始化的所有CopyReq,都使用此配置
83+ CosSysConfig::SetUploadCopyPartSize (20 * 1024 * 1024 );
84+
85+ qcloud_cos::CopyReq req (bucket_name, object_name);
86+ qcloud_cos::CopyResp resp;
87+
88+ req.SetXCosCopySource (source);
89+ qcloud_cos::CosResult result = cos.Copy (req, &resp);
90+
91+ std::cout << " ===========================Copy=============================" << std::endl;
92+ PrintResult (result, resp);
93+ std::cout << " ============================================================" << std::endl;
94+ }
95+
96+ /*
97+ * 该 Demo 示范如何在当前CosAPI的存储桶中移动一个对象
98+ * 支持大对象移动,但仅支持当前存储桶
99+ * 如需要移动跨桶对象,请使用 PutObjectCopy 或 Copy 接口复制后删除原文件
100+ */
101+ void MoveObjectDemo (qcloud_cos::CosAPI& cos) {
102+ std::string src_object = " test_src.txt" ;
103+ std::string dst_object = " test_dst.txt" ;
104+ qcloud_cos::MoveObjectReq req (bucket_name, src_object, dst_object);
105+
106+ qcloud_cos::CosResult result = cos.MoveObject (req);
107+
108+ std::cout << " ========================MoveObject==========================" << std::endl;
109+ if (result.IsSucc ()) {
110+ std::cout << " MoveObject Succ." << std::endl;
111+ } else {
112+ std::cout << " MoveObject Fail, ErrorMsg: " << result.GetErrorMsg () << std::endl;
113+ }
114+ std::cout << " ============================================================" << std::endl;
115+ }
116+
117+ /*
118+ * 该 Demo 示范用户如何自行组合分块操作拷贝对象到目标存储桶
119+ * 分块操作基于初始化、拷贝分块、完成分块三个接口实现将整个源对象切分为多个分块,然后再将这些分块拷贝到目标存储桶中
120+ * 支持大对象,支持跨区域,其中每个分块最大支持 5GB,最小支持 1MB,最后一个分块可以小于 1MB
121+ */
122+ void CopyPartDemo (qcloud_cos::CosAPI& cos) {
123+ std::string dst_object = " test_dst.txt" ;
124+ std::string source = bucket_name + " .cos." + region + " .myqcloud.com/test_src.txt" ; // 复制源对象
125+
126+ // 1. InitMultiUpload
127+ qcloud_cos::InitMultiUploadReq init_req (bucket_name, dst_object);
128+ qcloud_cos::InitMultiUploadResp init_resp;
129+ qcloud_cos::CosResult init_result = cos.InitMultiUpload (init_req, &init_resp);
130+
131+ std::cout << " =====================InitMultiUpload=====================" << std::endl;
132+ PrintResult (init_result, init_resp);
133+ std::cout << " =========================================================" << std::endl;
134+
135+ // 2. UploadPartCopyData
136+ // UploadPartCopyData 部分,可以根据实际选择分块数量和每次分块的 range,这里以 2 个分块为例
137+ std::vector<std::string> etags;
138+ std::vector<uint64_t > part_numbers;
139+ std::string upload_id = init_resp.GetUploadId ();
140+ {
141+ uint64_t part_number = 1 ;
142+ qcloud_cos::UploadPartCopyDataReq req (bucket_name, dst_object, upload_id, part_number);
143+ req.SetXCosCopySource (source);
144+ req.SetXCosCopySourceRange (" bytes=0-104857599" ); // 可根据实际选择 range
145+ qcloud_cos::UploadPartCopyDataResp resp;
146+ qcloud_cos::CosResult result = cos.UploadPartCopyData (req, &resp);
147+ std::cout << " ==================UploadPartCopyDataResp1=====================" << std::endl;
148+ PrintResult (result, resp);
149+ std::cout << " ==============================================================" << std::endl;
150+ if (result.IsSucc ()) {
151+ part_numbers.push_back (1 );
152+ etags.push_back (resp.GetEtag ());
153+ }
154+ }
155+ {
156+ uint64_t part_number = 2 ;
157+ qcloud_cos::UploadPartCopyDataReq req (bucket_name, dst_object, upload_id, part_number);
158+ req.SetXCosCopySource (source);
159+ req.SetXCosCopySourceRange (" bytes=104857600-209715199" ); // 可根据实际选择 range
160+ qcloud_cos::UploadPartCopyDataResp resp;
161+ qcloud_cos::CosResult result = cos.UploadPartCopyData (req, &resp);
162+
163+ std::cout << " ==================UploadPartCopyDataResp2=====================" << std::endl;
164+ PrintResult (result, resp);
165+ std::cout << " ==============================================================" << std::endl;
166+ if (result.IsSucc ()) {
167+ part_numbers.push_back (2 );
168+ etags.push_back (resp.GetEtag ());
169+ }
170+ }
171+
172+ // 3. Complete
173+ CompleteMultiUploadReq comp_req (bucket_name, dst_object, upload_id);
174+ CompleteMultiUploadResp comp_resp;
175+
176+ comp_req.SetEtags (etags);
177+ comp_req.SetPartNumbers (part_numbers);
178+
179+ qcloud_cos::CosResult result = cos.CompleteMultiUpload (comp_req, &comp_resp);
180+
181+ std::cout << " ===================Complete=============================" << std::endl;
182+ PrintResult (result, comp_resp);
183+ std::cout << " ========================================================" << std::endl;
184+
185+ return ;
186+ }
187+ int main () {
188+ qcloud_cos::CosAPI cos = InitCosAPI ();
189+ CosSysConfig::SetLogLevel ((LOG_LEVEL)COS_LOG_ERR);
190+ PutObjectCopyDemo (cos);
191+ CopyDemo (cos);
192+ MoveObjectDemo (cos);
193+ CopyPartDemo (cos);
194+ }
0 commit comments