@@ -278,9 +278,9 @@ void AsyncPutObjectDemo(qcloud_cos::CosAPI& cos) {
278278/* 
279279 * 该 Demo 示范用户如何自行组合分块上传各接口进行对象上传 
280280 * 分块操作基于初始化、上传分块、完成分块三个接口可以实现将对象切分为多个分块,然后再将这些分块上传到 cos,最后发起 Complete 完成分块上传 
281-  * 与本节中的高级上传接口配置一样,可通过全局设置上传线程池大小、分块大小。该上传线程池上是每次上传独立的。 
282281 * 本 Demo 中的上传分块接口 UploadPartData 仅支持传入流,最多支持10000分块,每个分块大小为1MB - 5GB,最后一个分块可以小于1MB 
283282 */  
283+ 
284284void  PutPartDemo (qcloud_cos::CosAPI& cos) {
285285    std::string object_name = " big_file.txt" 
286286
@@ -295,19 +295,36 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
295295
296296    //  2. UploadPartData
297297    //  UploadPartData 部分,可以根据实际选择分块数量和分块大小,这里以 2 个分块为例
298+ 
299+         //  Complete 需要的两个列表:
298300    std::vector<std::string> etags;
299301    std::vector<uint64_t > part_numbers;
302+ 
300303    std::string upload_id = init_resp.GetUploadId ();
301304    {
302305        uint64_t  part_number = 1 ;
303-         //  模拟上传分块数据,这里以 1M 为例
304-         std::vector<char > data (1024  * 1024 , ' A' 
306+         //  模拟上传分块数据,这里以 100M 为例
307+         uint64_t  copy_size = 1024  * 1024  * 100 ;
308+         std::vector<char > data (copy_size, ' A' 
305309        std::string content (data.begin (), data.end ());
306310        std::istringstream iss (content);
307311        qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
308312        req.SetPartNumber (part_number);
313+             //  限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
314+             uint64_t  traffic_limit = 8192 *1024 *10 ; //  100MB 文件 5M
315+             req.SetTrafficLimit (traffic_limit);
309316        qcloud_cos::UploadPartDataResp resp;
317+         std::chrono::time_point<std::chrono::steady_clock> start_ts, end_ts;
318+         start_ts = std::chrono::steady_clock::now ();
310319        qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
320+         end_ts = std::chrono::steady_clock::now ();
321+         auto  time_consumed_ms =
322+         std::chrono::duration_cast<std::chrono::milliseconds>(end_ts - start_ts)
323+             .count ();
324+         float  rate =
325+           ((float )copy_size / 1024  / 1024 ) / ((float )time_consumed_ms / 1000 );
326+         SDK_LOG_ERR (" send part_number: %d, send_size: %" "  MB, time_consumed: %" 
327+                     "  ms, rate: %.2f MB/s , traffic_limit : %.2f MB" 1024  / 1024 , time_consumed_ms, rate, traffic_limit/1024 /1024 /8.0 );
311328        std::cout << " ==================UploadPartDataResp1=====================" 
312329        PrintResult (result, resp);
313330        std::cout << " ==========================================================" 
@@ -318,12 +335,38 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
318335    }
319336    {
320337        uint64_t  part_number = 2 ;
321-         std::istringstream iss (" The last part can be smaller than 1MB" 
338+         uint64_t  copy_size = 1024  * 1024  * 100 ;
339+         std::vector<char > data (copy_size, ' A' 
340+         std::string content (data.begin (), data.end ());
341+         std::istringstream iss (content);
322342        qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
323343        req.SetPartNumber (part_number);
344+             //  限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
345+         uint64_t  traffic_limit = 8192  * 1024  * 5  ;
346+         req.SetTrafficLimit (traffic_limit);
347+         qcloud_cos::UploadPartDataResp resp;
348+         qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
349+         std::cout << " ==================UploadPartDataResp2=====================" 
350+         PrintResult (result, resp);
351+         std::cout << " ==========================================================" 
352+         if  (result.IsSucc ()) {
353+             part_numbers.push_back (part_number);
354+             etags.push_back (resp.GetEtag ());
355+         }
356+     }
357+     {
358+         uint64_t  part_number = 3 ;
359+         uint64_t  copy_size = 1024  * 1024  * 10 ;
360+         std::vector<char > data (copy_size, ' A' 
361+         std::string content (data.begin (), data.end ());
362+         std::istringstream iss (content);
363+         qcloud_cos::UploadPartDataReq req (bucket_name, object_name, upload_id, iss);
364+         req.SetPartNumber (part_number);
365+             //  限速上传对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800, 即800Kb/s-800Mb/s
366+             uint64_t  traffic_limit = 8192  * 1024 ;
367+             req.SetTrafficLimit (traffic_limit);
324368        qcloud_cos::UploadPartDataResp resp;
325369        qcloud_cos::CosResult result = cos.UploadPartData (req, &resp);
326- 
327370        std::cout << " ==================UploadPartDataResp2=====================" 
328371        PrintResult (result, resp);
329372        std::cout << " ==========================================================" 
@@ -348,11 +391,48 @@ void PutPartDemo(qcloud_cos::CosAPI& cos) {
348391
349392    return ;
350393}
394+ void  PutObjectResumableSingleThreadSyncDemo (qcloud_cos::CosAPI& cos) {
395+     std::string local_file = " SingleThreadSync.txt" 
396+     std::string object_name = " SingleThreadSync.txt" 
397+ 
398+     qcloud_cos::PutObjectResumableSingleSyncReq req (bucket_name, object_name, local_file);
399+     req.AddHeader (" x-cos-meta-ssss1" " 1xxxxxxx" 
400+     req.AddHeader (" x-cos-meta-ssss2" " 2xxxxxxx" 
401+     req.AddHeader (" x-cos-meta-ssss3" " 3xxxxxxx" 
402+     req.AddHeader (" x-cos-meta-ssss4" " 4xxxxxxx" 
403+     uint64_t  traffic_limit = 8192  * 1024 ;// 1MB
404+     req.SetTrafficLimit (traffic_limit);
405+     // req.SetHttps();
406+     // req.SetSSLCtxCallback(SslCtxCallback, nullptr);
407+     qcloud_cos::PutObjectResumableSingleSyncResp resp;
408+     qcloud_cos::CosResult result = cos.PutObjectResumableSingleThreadSync (req, &resp);
409+     if  (result.IsSucc ()) {
410+         std::cout << " MultiUpload Succ." 
411+         std::cout << resp.GetLocation () << std::endl;
412+         std::cout << resp.GetKey () << std::endl;
413+         std::cout << resp.GetBucket () << std::endl;
414+         std::cout << resp.GetEtag () << std::endl;
415+     } else  {
416+         std::cout << " MultiUpload Fail." 
417+         //  获取具体失败在哪一步
418+         std::string resp_tag = resp.GetRespTag ();
419+         if  (" Init" 
420+             //  print result
421+         } else  if  (" Upload" 
422+             //  print result
423+         } else  if  (" Complete" 
424+             //  print result
425+         }
426+         PrintResult (result, resp);
427+     }
428+     std::cout << " ===========================================================" 
429+ }
351430int  main () {
352431    qcloud_cos::CosAPI cos = InitCosAPI ();
353432    CosSysConfig::SetLogLevel ((LOG_LEVEL)COS_LOG_ERR);
354433    MultiUploadObjectDemo (cos);
355434    AsyncMultiPutObjectDemo (cos);
356435    AsyncPutObjectDemo (cos);
357436    PutPartDemo (cos);
358- }
437+     PutObjectResumableSingleThreadSyncDemo (cos);
438+ }
0 commit comments