object_op.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. // Copyright (c) 2017, Tencent Inc.
  2. // All rights reserved.
  3. //
  4. // Author: sevenyou <sevenyou@tencent.com>
  5. // Created: 07/21/17
  6. // Description:
  7. #ifndef COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_
  8. #define COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_
  9. #include "op/base_op.h"
  10. #include "op/cos_result.h"
  11. #include "request/data_process_req.h"
  12. #include "request/object_req.h"
  13. #include "request/auditing_req.h"
  14. #include "response/data_process_resp.h"
  15. #include "response/object_resp.h"
  16. #include "response/auditing_resp.h"
  17. namespace qcloud_cos {
  18. class PartBufInfo {
  19. public:
  20. unsigned char* buf;
  21. size_t len;
  22. public:
  23. PartBufInfo() {
  24. buf = nullptr;
  25. len = 0;
  26. }
  27. };
  28. class FileUploadTask;
  29. class FileCopyTask;
  30. /// \brief 封装了Object相关的操作
  31. class ObjectOp : public BaseOp {
  32. public:
  33. /// \brief BucketOp构造函数
  34. ///
  35. /// \param cos_conf Cos配置
  36. explicit ObjectOp(const SharedConfig& config) : BaseOp(config) {}
  37. ObjectOp() {}
  38. /// \brief ObjectOP析构函数
  39. virtual ~ObjectOp() {}
  40. /// \brief 判断object是否存在
  41. bool IsObjectExist(const std::string& bucket_name,
  42. const std::string& object_name);
  43. std::string GetResumableUploadID(const PutObjectByFileReq& originReq,
  44. const std::string& bucket_name,
  45. const std::string& object_name,
  46. bool change_backup_domain = false);
  47. bool CheckUploadPart(const PutObjectByFileReq& req,
  48. const std::string& bucket_name,
  49. const std::string& object_name,
  50. const std::string& uploadid,
  51. std::vector<std::string>& already_exist);
  52. bool CheckSinglePart(const PutObjectByFileReq& req, uint64_t offset,
  53. uint64_t local_part_size, uint64_t size,
  54. const std::string& etag);
  55. /// \brief 获取对应Object的meta信息数据
  56. ///
  57. /// \param request HeadObject请求
  58. /// \param response HeadObject返回
  59. ///
  60. /// \return 返回HTTP请求的状态码及错误信息
  61. CosResult HeadObject(const HeadObjectReq& req, HeadObjectResp* resp, bool change_backup_domain = false);
  62. /// \brief 下载Bucket中的一个文件至流中
  63. ///
  64. /// \param request GetObjectByStream请求
  65. /// \param response GetObjectByStream返回
  66. ///
  67. /// \return 返回HTTP请求的状态码及错误信息
  68. CosResult GetObject(const GetObjectByStreamReq& req,
  69. GetObjectByStreamResp* resp, bool change_backup_domain = false);
  70. /// \brief 下载Bucket中的一个文件到本地
  71. ///
  72. /// \param request GetObjectByFile请求
  73. /// \param response GetObjectByFile返回
  74. ///
  75. /// \return 返回HTTP请求的状态码及错误信息
  76. CosResult GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp,
  77. const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
  78. /// \brief 多线程下载Bucket中的一个文件到本地
  79. ///
  80. /// \param request MultiGetObject请求
  81. /// \param response MultiGetObject返回
  82. ///
  83. /// \return 返回HTTP请求的状态码及错误信息
  84. CosResult MultiGetObject(const GetObjectByFileReq& req,
  85. GetObjectByFileResp* resp);
  86. /// \brief 将本地的文件上传至指定Bucket中
  87. ///
  88. /// \param request PutObjectByFile请求
  89. /// \param response PutObjectByFile返回
  90. ///
  91. /// \return 返回HTTP请求的状态码及错误信息
  92. CosResult PutObject(const PutObjectByFileReq& req, PutObjectByFileResp* resp,
  93. const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
  94. /// \brief 将指定流上传至指定Bucket中
  95. ///
  96. /// \param request PutObjectByStream请求
  97. /// \param response PutObjectByStream返回
  98. ///
  99. /// \return 返回HTTP请求的状态码及错误信息
  100. CosResult PutObject(const PutObjectByStreamReq& req,
  101. PutObjectByStreamResp* resp, const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
  102. /// \brief 删除Object
  103. ///
  104. /// \param req DeleteObject请求
  105. /// \param resp DeleteObject返回
  106. ///
  107. /// \return 本次请求的调用情况(如状态码等)
  108. CosResult DeleteObject(const DeleteObjectReq& req, DeleteObjectResp* resp, bool change_backup_domain = false);
  109. /// \brief 批量删除Object
  110. ///
  111. /// \param req DeleteObjects请求
  112. /// \param resp DeleteObjects返回
  113. ///
  114. /// \return 本次请求的调用情况(如状态码等)
  115. CosResult DeleteObjects(const DeleteObjectsReq& req, DeleteObjectsResp* resp, bool change_backup_domain = false);
  116. /// \brief
  117. /// 请求实现初始化分片上传,成功执行此请求以后会返回UploadId用于后续的Upload
  118. /// Part请求
  119. ///
  120. /// \param request InitMultiUpload请求
  121. /// \param response InitMultiUpload返回
  122. ///
  123. /// \return 返回HTTP请求的状态码及错误信息
  124. CosResult InitMultiUpload(const InitMultiUploadReq& req,
  125. InitMultiUploadResp* resp,
  126. bool change_backup_domain = false);
  127. /// \brief 初始化以后的分块上传,支持的块的数量为1到10000,块的大小为1MB到5GB
  128. ///
  129. /// \param request UploadPartData请求
  130. /// \param response UploadPartData返回
  131. ///
  132. /// \return 返回HTTP请求的状态码及错误信息
  133. CosResult UploadPartData(const UploadPartDataReq& req,
  134. UploadPartDataResp* resp,
  135. bool change_backup_domain = false);
  136. /// \brief
  137. /// 初始化以后的分块复制,实现将一个文件的分块内容从源路径复制到目标路径。
  138. /// 通过指定 x-cos-copy-source 来指定源文件,x-cos-copy-source-range
  139. /// 指定字节范围。 允许分块的大小为 5 MB - 5 GB。
  140. ///
  141. /// \param request UploadPartCopyData请求
  142. /// \param response UploadPartCopyData返回
  143. ///
  144. /// \return 返回HTTP请求的状态码及错误信息
  145. CosResult UploadPartCopyData(const UploadPartCopyDataReq& req,
  146. UploadPartCopyDataResp* resp,
  147. bool change_backup_domain = false);
  148. /// \brief 完成整个分块上传。当使用 Upload Parts 上传完所有块以后,
  149. /// 必须调用该 API 来完成整个文件的分块上传
  150. ///
  151. /// \param request CompleteMultiUpload请求
  152. /// \param response CompleteMultiUpload返回
  153. ///
  154. /// \return 返回HTTP请求的状态码及错误信息
  155. CosResult CompleteMultiUpload(const CompleteMultiUploadReq& req,
  156. CompleteMultiUploadResp* resp,
  157. bool change_backup_domain = false);
  158. /// \brief 异步多线程上传
  159. /// \param request MultiUploadObject请求
  160. /// \param response MultiUploadObject返回
  161. /// \param handler TransferHandler
  162. ///
  163. /// \return result
  164. CosResult MultiUploadObject(const PutObjectByFileReq& req,
  165. MultiPutObjectResp* resp,
  166. const SharedTransferHandler& handler = nullptr,
  167. bool change_backup_domain = false);
  168. /// \brief 单线程同步分块上传
  169. ///
  170. /// \return result
  171. CosResult UploadObjectResumableSingleThreadSync(const PutObjectByFileReq& req,
  172. PutObjectResumableSingleSyncResp* resp);
  173. /// \brief 舍弃一个分块上传并删除已上传的块
  174. ///
  175. /// \param req AbortMultiUpload请求
  176. /// \param resp AbortMultiUpload返回
  177. ///
  178. /// \return
  179. CosResult AbortMultiUpload(const AbortMultiUploadReq& req,
  180. AbortMultiUploadResp* resp,
  181. bool change_backup_domain = false);
  182. /// \brief 查询特定分块上传中的已上传的块
  183. ///
  184. /// \param req ListParts请求
  185. /// \param resp ListParts返回
  186. ///
  187. /// \return result
  188. CosResult ListParts(const ListPartsReq& req, ListPartsResp* resp, bool change_backup_domain = false);
  189. /// \brief 列出Object下的ACL
  190. ///
  191. /// \param req GetObjectACL请求
  192. /// \param resp GetObjectACL返回
  193. ///
  194. /// \return 本次请求的调用情况(如状态码等)
  195. CosResult GetObjectACL(const GetObjectACLReq& req, GetObjectACLResp* resp, bool change_backup_domain = false);
  196. /// \brief 增加/替换Object下的ACL, 可以通过Header或者Body传入ACL信息
  197. /// 注意Header 和 Body 只能选择其中一种,否则响应返回会冲突
  198. ///
  199. /// \param req PutObjectACL请求
  200. /// \param resp PutObjectACL返回
  201. ///
  202. /// \return 本次请求的调用情况(如状态码等)
  203. CosResult PutObjectACL(const PutObjectACLReq& req, PutObjectACLResp* resp, bool change_backup_domain = false);
  204. /// \brief 已存在的Object设置标签.
  205. ///
  206. /// \param req PutObjectTagging请求
  207. /// \param resp PutObjectTagging返回
  208. ///
  209. /// \return 本次请求的调用情况(如状态码等)
  210. CosResult PutObjectTagging(const PutObjectTaggingReq& req,
  211. PutObjectTaggingResp* resp);
  212. /// \brief 查询指定对象下已有的对象标签.
  213. ///
  214. /// \param req GetObjectTagging请求
  215. /// \param resp GetObjectTagging返回
  216. ///
  217. /// \return 本次请求的调用情况(如状态码等)
  218. CosResult GetObjectTagging(const GetObjectTaggingReq& req,
  219. GetObjectTaggingResp* resp);
  220. /// \brief 删除指定对象下已有的对象标签.
  221. ///
  222. /// \param req DeleteObjectTagging请求
  223. /// \param resp DeleteObjectTagging返回
  224. ///
  225. /// \return 本次请求的调用情况(如状态码等)
  226. CosResult DeleteObjectTagging(const DeleteObjectTaggingReq& req,
  227. DeleteObjectTaggingResp* resp);
  228. /// \brief 复制Object
  229. ///
  230. /// \param req PutObjectCopy请求
  231. /// \param resp PutObjectCopy返回
  232. ///
  233. /// \return 本次请求的调用情况(如状态码等)
  234. CosResult PutObjectCopy(const PutObjectCopyReq& req, PutObjectCopyResp* resp, bool change_backup_domain = false);
  235. /// \brief 复制文件,实现将一个文件的分块内容从源路径复制到目标路径。
  236. /// 通过指定 x-cos-copy-source 来指定源文件,x-cos-copy-source-range
  237. /// 指定字节范围。
  238. ///
  239. /// \param request Copy请求
  240. /// \param response Copy返回
  241. ///
  242. /// \return 返回HTTP请求的状态码及错误信息
  243. CosResult Copy(const CopyReq& req, CopyResp* resp, bool change_backup_domain = false);
  244. /// \brief 对一个通过 COS 归档为 archive 类型的对象进行恢复
  245. ///
  246. /// \param request PostObjectRestore请求
  247. /// \param response PostObjectRestore返回
  248. ///
  249. /// \return 返回HTTP请求的状态码及错误信息
  250. CosResult PostObjectRestore(const PostObjectRestoreReq& req,
  251. PostObjectRestoreResp* resp,
  252. bool change_backup_domain = false);
  253. std::string GeneratePresignedUrl(const GeneratePresignedUrlReq& req);
  254. CosResult OptionsObject(const OptionsObjectReq& req, OptionsObjectResp* resp, bool change_backup_domain = false);
  255. CosResult SelectObjectContent(const SelectObjectContentReq& req,
  256. SelectObjectContentResp* resp,
  257. bool change_backup_domain = false);
  258. CosResult AppendObject(const AppendObjectReq& req, AppendObjectResp* resp);
  259. /// \brief 创建推流通道
  260. ///
  261. /// \param request PutLiveChannelReq请求
  262. /// \param response PutLiveChannelResp返回
  263. ///
  264. /// \return 返回HTTP请求的状态码及错误信息
  265. CosResult PutLiveChannel(const PutLiveChannelReq& req,
  266. PutLiveChannelResp* resp,
  267. bool change_backup_domain = false);
  268. /// \brief 启用或禁用通道
  269. ///
  270. /// \param request PutLiveChannelSwitchReq请求
  271. /// \param response PutLiveChannelSwitchResp返回
  272. ///
  273. /// \return 返回HTTP请求的状态码及错误信息
  274. CosResult PutLiveChannelSwitch(const PutLiveChannelSwitchReq& req,
  275. PutLiveChannelSwitchResp* resp,
  276. bool change_backup_domain = false);
  277. /// \brief 获取直播通道配置
  278. ///
  279. /// \param request GetLiveChannelReq请求
  280. /// \param response GetLiveChannelResp返回
  281. ///
  282. /// \return 返回HTTP请求的状态码及错误信息
  283. CosResult GetLiveChannel(const GetLiveChannelReq& req,
  284. GetLiveChannelResp* resp,
  285. bool change_backup_domain = false);
  286. /// \brief 获取直播通道推流历史
  287. ///
  288. /// \param request GetLiveChannelHistoryReq请求
  289. /// \param response GetLiveChannelHistoryResp返回
  290. ///
  291. /// \return 返回HTTP请求的状态码及错误信息
  292. CosResult GetLiveChannelHistory(const GetLiveChannelHistoryReq& req,
  293. GetLiveChannelHistoryResp* resp,
  294. bool change_backup_domain = false);
  295. /// \brief 获取直播通道推流状态
  296. ///
  297. /// \param request GetLiveChannelStatusReq请求
  298. /// \param response GetLiveChannelStatusResp返回
  299. ///
  300. /// \return 返回HTTP请求的状态码及错误信息
  301. CosResult GetLiveChannelStatus(const GetLiveChannelStatusReq& req,
  302. GetLiveChannelStatusResp* resp,
  303. bool change_backup_domain = false);
  304. /// \brief 删除直播通
  305. ///
  306. /// \param request DeleteLiveChannelReq请求
  307. /// \param response DeleteLiveChannelResp返回
  308. ///
  309. /// \return 返回HTTP请求的状态码及错误信息
  310. CosResult DeleteLiveChannel(const DeleteLiveChannelReq& req,
  311. DeleteLiveChannelResp* resp,
  312. bool change_backup_domain = false);
  313. /// \brief 查询指定通道在指定时间段推流生成的播放列表
  314. ///
  315. /// \param request GetLiveChannelVodPlaylistReq请求
  316. /// \param response GetLiveChannelVodPlaylistResp返回
  317. ///
  318. /// \return 返回HTTP请求的状态码及错误信息
  319. CosResult GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req,
  320. GetLiveChannelVodPlaylistResp* resp,
  321. bool change_backup_domain = false);
  322. /// \brief 指定通道生成一个可供点播例用的播放列表
  323. ///
  324. /// \param request PostLiveChannelVodPlaylistReq请求
  325. /// \param response GetLiveChannelVodPlaylistResp返回
  326. ///
  327. /// \return 返回HTTP请求的状态码及错误信息
  328. CosResult PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req,
  329. PostLiveChannelVodPlaylistResp* resp,
  330. bool change_backup_domain = false);
  331. /// \brief 异步多线程下载,handler处理回调
  332. CosResult MultiThreadDownload(const GetObjectByFileReq& req,
  333. GetObjectByFileResp* resp,
  334. const SharedTransferHandler& handler = nullptr,
  335. bool change_backup_domain = false);
  336. /* Resumable接口 */
  337. /// \brief 支持断点下载
  338. CosResult ResumableGetObject(const GetObjectByFileReq& req,
  339. GetObjectByFileResp* resp,
  340. const SharedTransferHandler& handler = nullptr,
  341. bool change_backup_domain = false);
  342. /*批量及目录操作接口*/
  343. CosResult PutObjects(const PutObjectsByDirectoryReq& req,
  344. PutObjectsByDirectoryResp* resp,
  345. bool change_backup_domain = false);
  346. CosResult PutDirectory(const PutDirectoryReq& req, PutDirectoryResp* resp, bool change_backup_domain = false);
  347. CosResult MoveObject(const MoveObjectReq& req, bool change_backup_domain = false);
  348. /*数据处理接口*/
  349. /**基础图片处理**/
  350. /**图片持久化处理**/
  351. /***上传时处理***/
  352. CosResult PutImage(const PutImageByFileReq& req, PutImageByFileResp* resp);
  353. /***云上数据处理***/
  354. CosResult CloudImageProcess(const CloudImageProcessReq& req,
  355. CloudImageProcessResp* resp);
  356. /***下载图片时识别二维码***/
  357. CosResult GetQRcode(const GetQRcodeReq& req, GetQRcodeResp* resp);
  358. /*文档处理接口*/
  359. /***查询已经开通文档预览功能的 Bucket***/
  360. CosResult DescribeDocProcessBuckets(const DescribeDocProcessBucketsReq& req,
  361. DescribeDocProcessBucketsResp* resp);
  362. /***预览文档***/
  363. CosResult DocPreview(const DocPreviewReq& req, DocPreviewResp* resp);
  364. /***获取媒体文件的信息***/
  365. CosResult GetMediaInfo(const GetMediaInfoReq& req, GetMediaInfoResp* resp);
  366. CosResult GetImageAuditing(const GetImageAuditingReq& req, GetImageAuditingResp* resp);
  367. private:
  368. // 生成request body所需的xml字符串
  369. bool GenerateCompleteMultiUploadReqBody(const CompleteMultiUploadReq& req,
  370. std::string* req_body);
  371. /// \brief 多线程上传,handler处理回调
  372. CosResult
  373. MultiThreadUpload(const PutObjectByFileReq& req, const std::string& upload_id,
  374. const std::vector<std::string>& already_exist_parts,
  375. bool resume_flag, std::vector<std::string>* etags_ptr,
  376. std::vector<uint64_t>* part_numbers_ptr,
  377. uint64_t& crc64_file,
  378. const SharedTransferHandler& handler = nullptr,
  379. bool change_backup_domain = false);
  380. CosResult SingleThreadUpload(const PutObjectByFileReq& req, const std::string& upload_id,
  381. const std::vector<std::string>& already_exist_parts,
  382. bool resume_flag, std::vector<std::string>* etags_ptr,
  383. std::vector<uint64_t>* part_numbers_ptr, PutObjectByFileResp* resp,
  384. uint64_t& crc64);
  385. /// \brief 读取文件内容, 并返回读取的长度
  386. // uint64_t GetContent(const std::string& src, std::string* file_content) const;
  387. void FillUploadTask(const std::string& upload_id, const std::string& host,
  388. const std::string& path, unsigned char* file_content_buf,
  389. uint64_t len, uint64_t part_number,
  390. FileUploadTask* task_ptr, bool sign_header_host,
  391. bool check_crc64);
  392. void FillCopyTask(const std::string& upload_id, const std::string& host,
  393. const std::string& path, uint64_t part_number,
  394. const std::string& range,
  395. const std::map<std::string, std::string>& headers,
  396. const std::map<std::string, std::string>& params,
  397. bool verify_cert, const std::string& ca_location,
  398. SSLCtxCallback ssl_ctx_cb, void *user_data,
  399. FileCopyTask* task, bool sign_header_host);
  400. /// \brief 检查是否可以走断点下载
  401. /// \param req PutObjectByFile请求
  402. /// \param head_resp HeadObjectResp响应结果
  403. /// \param last_offset 返回的上一次下载偏移量
  404. /// \return true可以走断点下载,false表示不可以
  405. bool CheckResumableDownloadTask(
  406. const std::string& json_file,
  407. const std::map<std::string, std::string>& element_map,
  408. uint64_t* resume_offset);
  409. /// \brief 更新断点下载json文件
  410. /// \param json_file json文件名
  411. /// \param element_map 检查的元素映射
  412. /// \param last_offset 返回的上一次下载偏移量
  413. /// \return true文件检查成功, 否则失败
  414. void UpdateResumableDownloadTaskFile(
  415. const std::string& json_file,
  416. const std::map<std::string, std::string>& element_map,
  417. uint64_t resume_offset);
  418. void SetResultAndLogError(CosResult& result, const std::string& err_msg);
  419. /// \brief 跨平台文件定位,失败时设置错误信息
  420. /// \param fd 文件描述符
  421. /// \param offset 目标偏移量
  422. /// \param result 失败时写入错误信息的 CosResult
  423. /// \return true 定位成功,false 定位失败
  424. bool SeekFile(int fd, uint64_t offset, CosResult& result);
  425. };
  426. } // namespace qcloud_cos
  427. #endif // COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_