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