88#include " cos_api.h"
99#include " cos_sys_config.h"
1010#include " util/auth_tool.h"
11+ #include < openssl/ssl.h>
1112
1213/* *
1314 * 本样例演示了如何使用 COS C++ SDK 进行对象的高级上传
@@ -47,6 +48,8 @@ void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp
4748qcloud_cos::CosAPI InitCosAPI () {
4849 qcloud_cos::CosConfig config (appid, tmp_secret_id, tmp_secret_key, region);
4950 config.SetTmpToken (tmp_token); // 推荐使用临时密钥初始化 CosAPI 对象, 如果您使用永久密钥初始化 CosAPI 对象,请注释
51+ config.SetDestDomain (" xxxxx.xxxxx.com" );
52+ config.SetDomainSameToHost (true );
5053 qcloud_cos::CosAPI cos_tmp (config);
5154 return cos_tmp;
5255}
@@ -258,9 +261,22 @@ void AsyncPutObjectDemo(qcloud_cos::CosAPI& cos) {
258261/*
259262 * 该 Demo 示范用户如何自行组合分块上传各接口进行对象上传
260263 * 分块操作基于初始化、上传分块、完成分块三个接口可以实现将对象切分为多个分块,然后再将这些分块上传到 cos,最后发起 Complete 完成分块上传
261- * 与本节中的高级上传接口配置一样,可通过全局设置上传线程池大小、分块大小。该上传线程池上是每次上传独立的。
262264 * 本 Demo 中的上传分块接口 UploadPartData 仅支持传入流,最多支持10000分块,每个分块大小为1MB - 5GB,最后一个分块可以小于1MB
263265 */
266+
267+ int SslCtxCallback (void *ssl_ctx, void *data) {
268+ std::cout << " ssl_ctx: " << ssl_ctx << " data: " << data << std::endl;
269+
270+ SSL_CTX *ctx = (SSL_CTX *)ssl_ctx;
271+ std::cout << " ssl_ctx in" << std::endl;
272+ SSL_CTX_use_PrivateKey_file (ctx, " /data/cert/client_key.key" , SSL_FILETYPE_PEM);
273+ SSL_CTX_use_certificate_chain_file (ctx, " /data/cert/client_cert.cer" );
274+ std::cout << " ssl_ctx out" << std::endl;
275+
276+ return 0 ;
277+ }
278+
279+
264280void PutPartDemo (qcloud_cos::CosAPI& cos) {
265281 std::string object_name = " big_file.txt" ;
266282
@@ -275,19 +291,36 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
275291
276292 // 2. UploadPartData
277293 // UploadPartData 部分,可以根据实际选择分块数量和分块大小,这里以 2 个分块为例
294+
295+ // Complete 需要的两个列表:
278296 std::vector<std::string> etags;
279297 std::vector<uint64_t > part_numbers;
298+
280299 std::string upload_id = init_resp.GetUploadId ();
281300 {
282301 uint64_t part_number = 1 ;
283- // 模拟上传分块数据,这里以 1M 为例
284- std::vector<char > data (1024 * 1024 , ' A' );
302+ // 模拟上传分块数据,这里以 100M 为例
303+ uint64_t copy_size = 1024 * 1024 * 100 ;
304+ std::vector<char > data (copy_size, ' A' );
285305 std::string content (data.begin (), data.end ());
286306 std::istringstream iss (content);
287307 qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
288308 req.SetPartNumber (part_number);
309+ // 限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
310+ uint64_t traffic_limit = 8192 *1024 *10 ; // 100MB 文件 5M
311+ req.SetTrafficLimit (traffic_limit);
289312 qcloud_cos::UploadPartDataResp resp;
313+ std::chrono::time_point<std::chrono::steady_clock> start_ts, end_ts;
314+ start_ts = std::chrono::steady_clock::now ();
290315 qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
316+ end_ts = std::chrono::steady_clock::now ();
317+ auto time_consumed_ms =
318+ std::chrono::duration_cast<std::chrono::milliseconds>(end_ts - start_ts)
319+ .count ();
320+ float rate =
321+ ((float )copy_size / 1024 / 1024 ) / ((float )time_consumed_ms / 1000 );
322+ SDK_LOG_ERR (" send part_number: %d, send_size: %" PRIu64 " MB, time_consumed: %" PRIu64
323+ " ms, rate: %.2f MB/s , traffic_limit : %.2f MB" , part_number, copy_size/ 1024 / 1024 , time_consumed_ms, rate, traffic_limit/1024 /1024 /8.0 );
291324 std::cout << " ==================UploadPartDataResp1=====================" << std::endl;
292325 PrintResult (result, resp);
293326 std::cout << " ==========================================================" << std::endl;
@@ -298,12 +331,38 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
298331 }
299332 {
300333 uint64_t part_number = 2 ;
301- std::istringstream iss (" The last part can be smaller than 1MB" );
334+ uint64_t copy_size = 1024 * 1024 * 100 ;
335+ std::vector<char > data (copy_size, ' A' );
336+ std::string content (data.begin (), data.end ());
337+ std::istringstream iss (content);
302338 qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
303339 req.SetPartNumber (part_number);
340+ // 限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
341+ uint64_t traffic_limit = 8192 * 1024 * 5 ;
342+ req.SetTrafficLimit (traffic_limit);
343+ qcloud_cos::UploadPartDataResp resp;
344+ qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
345+ std::cout << " ==================UploadPartDataResp2=====================" << std::endl;
346+ PrintResult (result, resp);
347+ std::cout << " ==========================================================" << std::endl;
348+ if (result.IsSucc ()) {
349+ part_numbers.push_back (part_number);
350+ etags.push_back (resp.GetEtag ());
351+ }
352+ }
353+ {
354+ uint64_t part_number = 3 ;
355+ uint64_t copy_size = 1024 * 1024 * 10 ;
356+ std::vector<char > data (copy_size, ' A' );
357+ std::string content (data.begin (), data.end ());
358+ std::istringstream iss (content);
359+ qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
360+ req.SetPartNumber (part_number);
361+ // 限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
362+ uint64_t traffic_limit = 8192 * 1024 ;
363+ req.SetTrafficLimit (traffic_limit);
304364 qcloud_cos::UploadPartDataResp resp;
305365 qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
306-
307366 std::cout << " ==================UploadPartDataResp2=====================" << std::endl;
308367 PrintResult (result, resp);
309368 std::cout << " ==========================================================" << std::endl;
@@ -328,11 +387,49 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
328387
329388 return ;
330389}
390+ void PutObjectResumableSingleThreadSyncDemo (qcloud_cos::CosAPI& cos) {
391+ std::string local_file = " SingleThreadSync.txt" ;
392+ std::string object_name = " SingleThreadSync.txt" ;
393+
394+ qcloud_cos::PutObjectResumableSingleSyncReq req (bucket_name, object_name, local_file);
395+ req.SetHttps ();
396+ req.AddHeader (" x-cos-meta-ssss1" ," 1xxxxxxx" );
397+ req.AddHeader (" x-cos-meta-ssss2" ," 2xxxxxxx" );
398+ req.AddHeader (" x-cos-meta-ssss3" ," 3xxxxxxx" );
399+ req.AddHeader (" x-cos-meta-ssss4" ," 4xxxxxxx" );
400+ uint64_t traffic_limit = 8192 * 1024 ;// 1MB
401+ req.SetTrafficLimit (traffic_limit);
402+ req.SetCheckCRC64 (true );
403+ req.SetSSLCtxCallback (SslCtxCallback, nullptr );
404+ qcloud_cos::PutObjectResumableSingleSyncResp resp;
405+ qcloud_cos::CosResult result = cos.PutObjectResumableSingleThreadSync (req, &resp);
406+ if (result.IsSucc ()) {
407+ std::cout << " MultiUpload Succ." << std::endl;
408+ std::cout << resp.GetLocation () << std::endl;
409+ std::cout << resp.GetKey () << std::endl;
410+ std::cout << resp.GetBucket () << std::endl;
411+ std::cout << resp.GetEtag () << std::endl;
412+ } else {
413+ std::cout << " MultiUpload Fail." << std::endl;
414+ // 获取具体失败在哪一步
415+ std::string resp_tag = resp.GetRespTag ();
416+ if (" Init" == resp_tag) {
417+ // print result
418+ } else if (" Upload" == resp_tag) {
419+ // print result
420+ } else if (" Complete" == resp_tag) {
421+ // print result
422+ }
423+ PrintResult (result, resp);
424+ }
425+ std::cout << " ===========================================================" << std::endl;
426+ }
331427int main () {
332428 qcloud_cos::CosAPI cos = InitCosAPI ();
333429 CosSysConfig::SetLogLevel ((LOG_LEVEL)COS_LOG_ERR);
334430 MultiUploadObjectDemo (cos);
335431 AsyncMultiPutObjectDemo (cos);
336432 AsyncPutObjectDemo (cos);
337433 PutPartDemo (cos);
338- }
434+ PutObjectResumableSingleThreadSyncDemo (cos);
435+ }
0 commit comments