copy_move_object_demo.cpp 8.3 KB

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