Skip to content

Commit 885df26

Browse files
Merge pull request #166 from tencentyun/feature_huberyxxiao_b44af89c
优化 demo;优化 chunk 类接口响应解析 body
2 parents 4ed035c + 09c410b commit 885df26

25 files changed

+1910
-85
lines changed

demo/CMakeLists.txt

+43-6
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,52 @@ project(cos-demo)
33
if (NOT ${OS_TYPE} STREQUAL "WINDOWS")
44
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")
55
endif()
6-
file(GLOB demo_src "${CMAKE_SOURCE_DIR}/demo/cos_demo.cpp")
7-
file(GLOB stable_test_src "${CMAKE_SOURCE_DIR}/demo/stable_test.cpp")
6+
file(GLOB cos_demo_src "${CMAKE_SOURCE_DIR}/demo/cos_demo.cpp")
7+
file(GLOB put_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/put_object_demo.cpp")
8+
file(GLOB get_object_url_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/get_object_url_demo.cpp")
9+
file(GLOB head_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/head_object_demo.cpp")
10+
file(GLOB get_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/get_object_demo.cpp")
11+
file(GLOB delete_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/delete_object_demo.cpp")
12+
file(GLOB put_get_object_acl_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/put_get_object_acl_demo.cpp")
13+
file(GLOB put_get_delete_object_tagging_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/put_get_delete_object_tagging_demo.cpp")
14+
file(GLOB restore_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/restore_object_demo.cpp")
15+
file(GLOB copy_move_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/copy_move_object_demo.cpp")
16+
file(GLOB multi_put_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/multi_put_object_demo.cpp")
17+
file(GLOB multi_get_object_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/multi_get_object_demo.cpp")
18+
file(GLOB select_objec_demo_src "${CMAKE_SOURCE_DIR}/demo/object_op_demo/select_objec_demo.cpp")
819

920
link_directories(${POCO_LINK_DIR} ${OPENSSL_LINK_DIR}) #这一行要放到add_executable前面
10-
add_executable(${PROJECT_NAME} ${demo_src})
11-
add_executable(stable_test ${stable_test_src})
21+
22+
add_executable(cos_demo ${cos_demo_src})
23+
add_executable(put_object_demo ${put_object_demo_src})
24+
add_executable(get_object_url_demo ${get_object_url_demo_src})
25+
add_executable(head_object_demo ${head_object_demo_src})
26+
add_executable(get_object_demo ${get_object_demo_src})
27+
add_executable(delete_object_demo ${delete_object_demo_src})
28+
add_executable(put_get_object_acl_demo ${put_get_object_acl_demo_src})
29+
add_executable(put_get_delete_object_tagging_demo ${put_get_delete_object_tagging_demo_src})
30+
add_executable(restore_object_demo ${restore_object_demo_src})
31+
add_executable(copy_move_object_demo ${copy_move_object_demo_src})
32+
add_executable(multi_put_object_demo ${multi_put_object_demo_src})
33+
add_executable(multi_get_object_demo ${multi_get_object_demo_src})
34+
add_executable(select_objec_demo ${select_objec_demo_src})
35+
1236
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
13-
target_link_libraries(${PROJECT_NAME} cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
14-
target_link_libraries(stable_test cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
37+
38+
target_link_libraries(cos_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
39+
target_link_libraries(put_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
40+
target_link_libraries(get_object_url_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
41+
target_link_libraries(head_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
42+
target_link_libraries(get_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
43+
target_link_libraries(delete_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
44+
target_link_libraries(put_get_object_acl_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
45+
target_link_libraries(put_get_delete_object_tagging_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
46+
target_link_libraries(restore_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
47+
target_link_libraries(copy_move_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
48+
target_link_libraries(multi_put_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
49+
target_link_libraries(multi_get_object_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
50+
target_link_libraries(select_objec_demo cossdk ${POCO_LIBS} ${OPENSSL_LIBS} ${SYSTEM_LIBS})
51+
1552
include_directories(${CMAKE_SOURCE_DIR}/include/ ${POCO_INCLUDE_DIR})
1653

1754
if(${OS_TYPE} STREQUAL "WINDOWS")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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

Comments
 (0)