Files
cos-cpp-sdk-v5/include/op/object_op.h
a158 3cf88acc07 BG
2026-04-05 20:22:11 +08:00

503 lines
20 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Copyright (c) 2017, Tencent Inc.
// All rights reserved.
//
// Author: sevenyou <sevenyou@tencent.com>
// Created: 07/21/17
// Description:
#ifndef COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_
#define COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_
#include "op/base_op.h"
#include "op/cos_result.h"
#include "request/data_process_req.h"
#include "request/object_req.h"
#include "request/auditing_req.h"
#include "response/data_process_resp.h"
#include "response/object_resp.h"
#include "response/auditing_resp.h"
namespace qcloud_cos {
class PartBufInfo {
public:
unsigned char* buf;
size_t len;
public:
PartBufInfo() {
buf = nullptr;
len = 0;
}
};
class FileUploadTask;
class FileCopyTask;
/// \brief 封装了Object相关的操作
class ObjectOp : public BaseOp {
public:
/// \brief BucketOp构造函数
///
/// \param cos_conf Cos配置
explicit ObjectOp(const SharedConfig& config) : BaseOp(config) {}
ObjectOp() {}
/// \brief ObjectOP析构函数
virtual ~ObjectOp() {}
/// \brief 判断object是否存在
bool IsObjectExist(const std::string& bucket_name,
const std::string& object_name);
std::string GetResumableUploadID(const PutObjectByFileReq& originReq,
const std::string& bucket_name,
const std::string& object_name,
bool change_backup_domain = false);
bool CheckUploadPart(const PutObjectByFileReq& req,
const std::string& bucket_name,
const std::string& object_name,
const std::string& uploadid,
std::vector<std::string>& already_exist);
bool CheckSinglePart(const PutObjectByFileReq& req, uint64_t offset,
uint64_t local_part_size, uint64_t size,
const std::string& etag);
/// \brief 获取对应Object的meta信息数据
///
/// \param request HeadObject请求
/// \param response HeadObject返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult HeadObject(const HeadObjectReq& req, HeadObjectResp* resp, bool change_backup_domain = false);
/// \brief 下载Bucket中的一个文件至流中
///
/// \param request GetObjectByStream请求
/// \param response GetObjectByStream返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetObject(const GetObjectByStreamReq& req,
GetObjectByStreamResp* resp, bool change_backup_domain = false);
/// \brief 下载Bucket中的一个文件到本地
///
/// \param request GetObjectByFile请求
/// \param response GetObjectByFile返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp,
const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
/// \brief 多线程下载Bucket中的一个文件到本地
///
/// \param request MultiGetObject请求
/// \param response MultiGetObject返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult MultiGetObject(const GetObjectByFileReq& req,
GetObjectByFileResp* resp);
/// \brief 将本地的文件上传至指定Bucket中
///
/// \param request PutObjectByFile请求
/// \param response PutObjectByFile返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PutObject(const PutObjectByFileReq& req, PutObjectByFileResp* resp,
const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
/// \brief 将指定流上传至指定Bucket中
///
/// \param request PutObjectByStream请求
/// \param response PutObjectByStream返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PutObject(const PutObjectByStreamReq& req,
PutObjectByStreamResp* resp, const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false);
/// \brief 删除Object
///
/// \param req DeleteObject请求
/// \param resp DeleteObject返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult DeleteObject(const DeleteObjectReq& req, DeleteObjectResp* resp, bool change_backup_domain = false);
/// \brief 批量删除Object
///
/// \param req DeleteObjects请求
/// \param resp DeleteObjects返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult DeleteObjects(const DeleteObjectsReq& req, DeleteObjectsResp* resp, bool change_backup_domain = false);
/// \brief
/// 请求实现初始化分片上传,成功执行此请求以后会返回UploadId用于后续的Upload
/// Part请求
///
/// \param request InitMultiUpload请求
/// \param response InitMultiUpload返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult InitMultiUpload(const InitMultiUploadReq& req,
InitMultiUploadResp* resp,
bool change_backup_domain = false);
/// \brief 初始化以后的分块上传,支持的块的数量为1到10000,块的大小为1MB到5GB
///
/// \param request UploadPartData请求
/// \param response UploadPartData返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult UploadPartData(const UploadPartDataReq& req,
UploadPartDataResp* resp,
bool change_backup_domain = false);
/// \brief
/// 初始化以后的分块复制,实现将一个文件的分块内容从源路径复制到目标路径。
/// 通过指定 x-cos-copy-source 来指定源文件x-cos-copy-source-range
/// 指定字节范围。 允许分块的大小为 5 MB - 5 GB。
///
/// \param request UploadPartCopyData请求
/// \param response UploadPartCopyData返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult UploadPartCopyData(const UploadPartCopyDataReq& req,
UploadPartCopyDataResp* resp,
bool change_backup_domain = false);
/// \brief 完成整个分块上传。当使用 Upload Parts 上传完所有块以后,
/// 必须调用该 API 来完成整个文件的分块上传
///
/// \param request CompleteMultiUpload请求
/// \param response CompleteMultiUpload返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult CompleteMultiUpload(const CompleteMultiUploadReq& req,
CompleteMultiUploadResp* resp,
bool change_backup_domain = false);
/// \brief 异步多线程上传
/// \param request MultiUploadObject请求
/// \param response MultiUploadObject返回
/// \param handler TransferHandler
///
/// \return result
CosResult MultiUploadObject(const PutObjectByFileReq& req,
MultiPutObjectResp* resp,
const SharedTransferHandler& handler = nullptr,
bool change_backup_domain = false);
/// \brief 单线程同步分块上传
///
/// \return result
CosResult UploadObjectResumableSingleThreadSync(const PutObjectByFileReq& req,
PutObjectResumableSingleSyncResp* resp);
/// \brief 舍弃一个分块上传并删除已上传的块
///
/// \param req AbortMultiUpload请求
/// \param resp AbortMultiUpload返回
///
/// \return
CosResult AbortMultiUpload(const AbortMultiUploadReq& req,
AbortMultiUploadResp* resp,
bool change_backup_domain = false);
/// \brief 查询特定分块上传中的已上传的块
///
/// \param req ListParts请求
/// \param resp ListParts返回
///
/// \return result
CosResult ListParts(const ListPartsReq& req, ListPartsResp* resp, bool change_backup_domain = false);
/// \brief 列出Object下的ACL
///
/// \param req GetObjectACL请求
/// \param resp GetObjectACL返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult GetObjectACL(const GetObjectACLReq& req, GetObjectACLResp* resp, bool change_backup_domain = false);
/// \brief 增加/替换Object下的ACL, 可以通过Header或者Body传入ACL信息
/// 注意Header 和 Body 只能选择其中一种,否则响应返回会冲突
///
/// \param req PutObjectACL请求
/// \param resp PutObjectACL返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult PutObjectACL(const PutObjectACLReq& req, PutObjectACLResp* resp, bool change_backup_domain = false);
/// \brief 已存在的Object设置标签.
///
/// \param req PutObjectTagging请求
/// \param resp PutObjectTagging返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult PutObjectTagging(const PutObjectTaggingReq& req,
PutObjectTaggingResp* resp);
/// \brief 查询指定对象下已有的对象标签.
///
/// \param req GetObjectTagging请求
/// \param resp GetObjectTagging返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult GetObjectTagging(const GetObjectTaggingReq& req,
GetObjectTaggingResp* resp);
/// \brief 删除指定对象下已有的对象标签.
///
/// \param req DeleteObjectTagging请求
/// \param resp DeleteObjectTagging返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult DeleteObjectTagging(const DeleteObjectTaggingReq& req,
DeleteObjectTaggingResp* resp);
/// \brief 复制Object
///
/// \param req PutObjectCopy请求
/// \param resp PutObjectCopy返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult PutObjectCopy(const PutObjectCopyReq& req, PutObjectCopyResp* resp, bool change_backup_domain = false);
/// \brief 复制文件,实现将一个文件的分块内容从源路径复制到目标路径。
/// 通过指定 x-cos-copy-source 来指定源文件x-cos-copy-source-range
/// 指定字节范围。
///
/// \param request Copy请求
/// \param response Copy返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult Copy(const CopyReq& req, CopyResp* resp, bool change_backup_domain = false);
/// \brief 对一个通过 COS 归档为 archive 类型的对象进行恢复
///
/// \param request PostObjectRestore请求
/// \param response PostObjectRestore返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PostObjectRestore(const PostObjectRestoreReq& req,
PostObjectRestoreResp* resp,
bool change_backup_domain = false);
std::string GeneratePresignedUrl(const GeneratePresignedUrlReq& req);
CosResult OptionsObject(const OptionsObjectReq& req, OptionsObjectResp* resp, bool change_backup_domain = false);
CosResult SelectObjectContent(const SelectObjectContentReq& req,
SelectObjectContentResp* resp,
bool change_backup_domain = false);
CosResult AppendObject(const AppendObjectReq& req, AppendObjectResp* resp);
/// \brief 创建推流通道
///
/// \param request PutLiveChannelReq请求
/// \param response PutLiveChannelResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PutLiveChannel(const PutLiveChannelReq& req,
PutLiveChannelResp* resp,
bool change_backup_domain = false);
/// \brief 启用或禁用通道
///
/// \param request PutLiveChannelSwitchReq请求
/// \param response PutLiveChannelSwitchResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PutLiveChannelSwitch(const PutLiveChannelSwitchReq& req,
PutLiveChannelSwitchResp* resp,
bool change_backup_domain = false);
/// \brief 获取直播通道配置
///
/// \param request GetLiveChannelReq请求
/// \param response GetLiveChannelResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetLiveChannel(const GetLiveChannelReq& req,
GetLiveChannelResp* resp,
bool change_backup_domain = false);
/// \brief 获取直播通道推流历史
///
/// \param request GetLiveChannelHistoryReq请求
/// \param response GetLiveChannelHistoryResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetLiveChannelHistory(const GetLiveChannelHistoryReq& req,
GetLiveChannelHistoryResp* resp,
bool change_backup_domain = false);
/// \brief 获取直播通道推流状态
///
/// \param request GetLiveChannelStatusReq请求
/// \param response GetLiveChannelStatusResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetLiveChannelStatus(const GetLiveChannelStatusReq& req,
GetLiveChannelStatusResp* resp,
bool change_backup_domain = false);
/// \brief 删除直播通
///
/// \param request DeleteLiveChannelReq请求
/// \param response DeleteLiveChannelResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult DeleteLiveChannel(const DeleteLiveChannelReq& req,
DeleteLiveChannelResp* resp,
bool change_backup_domain = false);
/// \brief 查询指定通道在指定时间段推流生成的播放列表
///
/// \param request GetLiveChannelVodPlaylistReq请求
/// \param response GetLiveChannelVodPlaylistResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req,
GetLiveChannelVodPlaylistResp* resp,
bool change_backup_domain = false);
/// \brief 指定通道生成一个可供点播例用的播放列表
///
/// \param request PostLiveChannelVodPlaylistReq请求
/// \param response GetLiveChannelVodPlaylistResp返回
///
/// \return 返回HTTP请求的状态码及错误信息
CosResult PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req,
PostLiveChannelVodPlaylistResp* resp,
bool change_backup_domain = false);
/// \brief 异步多线程下载,handler处理回调
CosResult MultiThreadDownload(const GetObjectByFileReq& req,
GetObjectByFileResp* resp,
const SharedTransferHandler& handler = nullptr,
bool change_backup_domain = false);
/* Resumable接口 */
/// \brief 支持断点下载
CosResult ResumableGetObject(const GetObjectByFileReq& req,
GetObjectByFileResp* resp,
const SharedTransferHandler& handler = nullptr,
bool change_backup_domain = false);
/*批量及目录操作接口*/
CosResult PutObjects(const PutObjectsByDirectoryReq& req,
PutObjectsByDirectoryResp* resp,
bool change_backup_domain = false);
CosResult PutDirectory(const PutDirectoryReq& req, PutDirectoryResp* resp, bool change_backup_domain = false);
CosResult MoveObject(const MoveObjectReq& req, bool change_backup_domain = false);
/*数据处理接口*/
/**基础图片处理**/
/**图片持久化处理**/
/***上传时处理***/
CosResult PutImage(const PutImageByFileReq& req, PutImageByFileResp* resp);
/***云上数据处理***/
CosResult CloudImageProcess(const CloudImageProcessReq& req,
CloudImageProcessResp* resp);
/***下载图片时识别二维码***/
CosResult GetQRcode(const GetQRcodeReq& req, GetQRcodeResp* resp);
/*文档处理接口*/
/***查询已经开通文档预览功能的 Bucket***/
CosResult DescribeDocProcessBuckets(const DescribeDocProcessBucketsReq& req,
DescribeDocProcessBucketsResp* resp);
/***预览文档***/
CosResult DocPreview(const DocPreviewReq& req, DocPreviewResp* resp);
/***获取媒体文件的信息***/
CosResult GetMediaInfo(const GetMediaInfoReq& req, GetMediaInfoResp* resp);
CosResult GetImageAuditing(const GetImageAuditingReq& req, GetImageAuditingResp* resp);
private:
// 生成request body所需的xml字符串
bool GenerateCompleteMultiUploadReqBody(const CompleteMultiUploadReq& req,
std::string* req_body);
/// \brief 多线程上传,handler处理回调
CosResult
MultiThreadUpload(const PutObjectByFileReq& req, const std::string& upload_id,
const std::vector<std::string>& already_exist_parts,
bool resume_flag, std::vector<std::string>* etags_ptr,
std::vector<uint64_t>* part_numbers_ptr,
uint64_t& crc64_file,
const SharedTransferHandler& handler = nullptr,
bool change_backup_domain = false);
CosResult SingleThreadUpload(const PutObjectByFileReq& req, const std::string& upload_id,
const std::vector<std::string>& already_exist_parts,
bool resume_flag, std::vector<std::string>* etags_ptr,
std::vector<uint64_t>* part_numbers_ptr, PutObjectByFileResp* resp,
uint64_t& crc64);
/// \brief 读取文件内容, 并返回读取的长度
// uint64_t GetContent(const std::string& src, std::string* file_content) const;
void FillUploadTask(const std::string& upload_id, const std::string& host,
const std::string& path, unsigned char* file_content_buf,
uint64_t len, uint64_t part_number,
FileUploadTask* task_ptr, bool sign_header_host,
bool check_crc64);
void FillCopyTask(const std::string& upload_id, const std::string& host,
const std::string& path, uint64_t part_number,
const std::string& range,
const std::map<std::string, std::string>& headers,
const std::map<std::string, std::string>& params,
bool verify_cert, const std::string& ca_location,
SSLCtxCallback ssl_ctx_cb, void *user_data,
FileCopyTask* task, bool sign_header_host);
/// \brief 检查是否可以走断点下载
/// \param req PutObjectByFile请求
/// \param head_resp HeadObjectResp响应结果
/// \param last_offset 返回的上一次下载偏移量
/// \return true可以走断点下载,false表示不可以
bool CheckResumableDownloadTask(
const std::string& json_file,
const std::map<std::string, std::string>& element_map,
uint64_t* resume_offset);
/// \brief 更新断点下载json文件
/// \param json_file json文件名
/// \param element_map 检查的元素映射
/// \param last_offset 返回的上一次下载偏移量
/// \return true文件检查成功, 否则失败
void UpdateResumableDownloadTaskFile(
const std::string& json_file,
const std::map<std::string, std::string>& element_map,
uint64_t resume_offset);
void SetResultAndLogError(CosResult& result, const std::string& err_msg);
/// \brief 跨平台文件定位,失败时设置错误信息
/// \param fd 文件描述符
/// \param offset 目标偏移量
/// \param result 失败时写入错误信息的 CosResult
/// \return true 定位成功false 定位失败
bool SeekFile(int fd, uint64_t offset, CosResult& result);
};
} // namespace qcloud_cos
#endif // COS_CPP_SDK_V5_INCLUDE_OP_OBJECT_OP_H_