11
11
#include < iostream>
12
12
#include < map>
13
13
#include < string>
14
+ #include < thread>
14
15
#include < vector>
15
16
16
17
#include " cos_api.h"
@@ -23,7 +24,7 @@ void PrintResult(const qcloud_cos::CosResult& result,
23
24
if (result.IsSucc ()) {
24
25
std::cout << resp.DebugString () << std::endl;
25
26
} else {
26
- std::cout << " ErrorInfo =" << result.GetErrorInfo () << std::endl;
27
+ std::cout << " ErrorMsg =" << result.GetErrorMsg () << std::endl;
27
28
std::cout << " HttpStatus=" << result.GetHttpStatus () << std::endl;
28
29
std::cout << " ErrorCode=" << result.GetErrorCode () << std::endl;
29
30
std::cout << " ErrorMsg=" << result.GetErrorMsg () << std::endl;
@@ -625,10 +626,10 @@ void CompleteMultiUpload(qcloud_cos::CosAPI& cos,
625
626
void MultiUploadObject (qcloud_cos::CosAPI& cos, const std::string& bucket_name,
626
627
const std::string& object_name,
627
628
const std::string& local_file) {
628
- qcloud_cos::MultiUploadObjectReq req (bucket_name, object_name, local_file);
629
+ qcloud_cos::MultiPutObjectReq req (bucket_name, object_name, local_file);
629
630
req.SetRecvTimeoutInms (1000 * 60 );
630
- qcloud_cos::MultiUploadObjectResp resp;
631
- qcloud_cos::CosResult result = cos.MultiUploadObject (req, &resp);
631
+ qcloud_cos::MultiPutObjectResp resp;
632
+ qcloud_cos::CosResult result = cos.PutObject (req, &resp);
632
633
633
634
if (result.IsSucc ()) {
634
635
std::cout << " MultiUpload Succ." << std::endl;
@@ -662,11 +663,11 @@ void MultiUploadObjectWideChar(qcloud_cos::CosAPI& cos,
662
663
const std::string& bucket_name) {
663
664
std::string local_file = " ./안녕하십니까.mp4" ;
664
665
std::string object_name = " 안녕하십니까.mp4" ;
665
- qcloud_cos::MultiUploadObjectReq req (bucket_name, object_name, local_file);
666
+ qcloud_cos::MultiPutObjectReq req (bucket_name, object_name, local_file);
666
667
req.SetWideCharPath (); // 需要调用该函数
667
668
req.SetRecvTimeoutInms (1000 * 60 );
668
- qcloud_cos::MultiUploadObjectResp resp;
669
- qcloud_cos::CosResult result = cos.MultiUploadObject (req, &resp);
669
+ qcloud_cos::MultiPutObjectResp resp;
670
+ qcloud_cos::CosResult result = cos.PutObject (req, &resp);
670
671
671
672
if (result.IsSucc ()) {
672
673
std::cout << " MultiUploadObjectWideChar Succ." << std::endl;
@@ -693,15 +694,15 @@ void MultiUploadObjectLimitTraffic(qcloud_cos::CosAPI& cos,
693
694
const std::string& local_file,
694
695
const uint64_t traffic_limit,
695
696
bool set_header = true ) {
696
- qcloud_cos::MultiUploadObjectReq req (bucket_name, object_name, local_file);
697
+ qcloud_cos::MultiPutObjectReq req (bucket_name, object_name, local_file);
697
698
if (set_header) {
698
699
req.SetTrafficLimitByHeader (StringUtil::Uint64ToString (traffic_limit));
699
700
} else {
700
701
req.SetTrafficLimitByParam (StringUtil::Uint64ToString (traffic_limit));
701
702
}
702
703
req.SetRecvTimeoutInms (1000 * 60 );
703
- qcloud_cos::MultiUploadObjectResp resp;
704
- qcloud_cos::CosResult result = cos.MultiUploadObject (req, &resp);
704
+ qcloud_cos::MultiPutObjectResp resp;
705
+ qcloud_cos::CosResult result = cos.PutObject (req, &resp);
705
706
706
707
if (result.IsSucc ()) {
707
708
std::cout << " MultiUpload Succ." << std::endl;
@@ -1659,88 +1660,118 @@ static void ProgressCallback(uint64_t transferred_size, uint64_t total_size,
1659
1660
}
1660
1661
}
1661
1662
1662
- static void StatusCallback (const std::string& status, void * user_data) {
1663
- qcloud_cos::ObjectReq* req = static_cast <qcloud_cos::ObjectReq*>(user_data);
1664
- std::cout << " ObjectName:" << req->GetObjectName ()
1665
- << " , CurrentStatus:" << status << std::endl;
1663
+ static void MultiGetObjectAsyncDoneCallback (const SharedAsyncContext& context,
1664
+ void * user_data) {
1665
+ std::cout << " MultiGetObjectAsyncDoneCallback, BucketName:"
1666
+ << context->GetBucketName ()
1667
+ << " , ObjectName:" << context->GetObjectName ()
1668
+ << " , LocalFile:" << context->GetLocalFilePath () << std::endl;
1669
+ // qcloud_cos::MultiGetObjectReq对应的响应为qcloud_cos::MultiGetObjectResp
1670
+ if (context->GetResult ().IsSucc ()) {
1671
+ // 获取响应
1672
+ std::cout << " MultiGetObjectAsync succeed" << std::endl;
1673
+ std::cout << " Result:" << context->GetResult ().DebugString () << std::endl;
1674
+ MultiGetObjectResp resp = context->GetMultiGetObjectResp ();
1675
+ std::cout << " ETag:" << resp.GetEtag () << std::endl;
1676
+ std::cout << " Crc64:" << resp.GetXCosHashCrc64Ecma () << std::endl;
1677
+ } else {
1678
+ std::cout << " MultiGetObjectAsync failed" << std::endl;
1679
+ std::cout << " ErrorMsg:" << context->GetResult ().GetErrorMsg () << std::endl;
1680
+ }
1666
1681
}
1667
-
1668
1682
// 异步下载对象,支持更新下载进度
1669
- void GetObjectAsync (qcloud_cos::CosAPI& cos, const std::string& bucket_name,
1670
- const std::string& object_name,
1671
- const std::string& file_path) {
1683
+ void MultiGetObjectAsync (qcloud_cos::CosAPI& cos,
1684
+ const std::string& bucket_name,
1685
+ const std::string& object_name,
1686
+ const std::string& file_path) {
1672
1687
qcloud_cos::MultiGetObjectReq req (bucket_name, object_name, file_path);
1673
- qcloud_cos::MultiGetObjectResp resp;
1674
1688
// 设置进度回调
1675
1689
req.SetTransferProgressCallback (&ProgressCallback);
1676
1690
// 设置状态回调
1677
- req.SetTransferStatusCallback (&StatusCallback );
1691
+ req.SetDoneCallback (&MultiGetObjectAsyncDoneCallback );
1678
1692
// 设置私有数据
1679
- req.SetTransferCallbackUserData (&req);
1693
+ req.SetUserData (&req);
1680
1694
1681
1695
// 开始下载
1682
- SharedTransferHandler handler = cos.GetObjectAsync (req, &resp );
1696
+ SharedAsyncContext context = cos.GetObjectAsync (req);
1683
1697
1684
1698
// 等待下载结束
1685
- handler ->WaitUntilFinish ();
1699
+ context ->WaitUntilFinish ();
1686
1700
1687
1701
// 检查结果
1688
- if (handler->m_result .IsSucc ()) {
1689
- std::cout << " GetObjectAsync Succ." << std::endl;
1690
- std::cout << " Etag:" << resp.GetEtag () << std::endl;
1691
- std::cout << " ContentLength:" << resp.GetContentLength () << std::endl;
1702
+ if (context->GetResult ().IsSucc ()) {
1703
+ // 获取响应
1704
+ std::cout << " MultiGetObjectAsync succeed" << std::endl;
1705
+ std::cout << " Result:" << context->GetResult ().DebugString () << std::endl;
1706
+ MultiGetObjectResp resp = context->GetMultiGetObjectResp ();
1707
+ std::cout << " ETag:" << resp.GetEtag () << std::endl;
1708
+ std::cout << " Crc64:" << resp.GetXCosHashCrc64Ecma () << std::endl;
1692
1709
} else {
1693
- std::cout << " GetObjectAsync Fail." << std::endl;
1694
- std::cout << " ErrorMsg:" << handler->m_result .GetErrorMsg () << std::endl;
1710
+ std::cout << " MultiGetObjectAsync failed" << std::endl;
1711
+ std::cout << " ErrorMsg:" << context->GetResult ().GetErrorMsg () << std::endl;
1712
+ }
1713
+ std::this_thread::sleep_for (std::chrono::seconds (1 ));
1714
+ }
1715
+
1716
+ static void MultiPutObjectAsyncDoneCallback (const SharedAsyncContext& context,
1717
+ void * user_data) {
1718
+ std::cout << " MultiPutObjectAsyncDoneCallback, BucketName:"
1719
+ << context->GetBucketName ()
1720
+ << " , ObjectName:" << context->GetObjectName ()
1721
+ << " , LocalFile:" << context->GetLocalFilePath () << std::endl;
1722
+ // qcloud_cos::MultiPutObjectReq对应的响应为qcloud_cos::MultiPutObjectResp
1723
+ if (context->GetResult ().IsSucc ()) {
1724
+ // 获取响应
1725
+ std::cout << " MultiPutObjectAsync succeed" << std::endl;
1726
+ std::cout << " Result:" << context->GetResult ().DebugString () << std::endl;
1727
+ MultiPutObjectResp resp = context->GetMultiPutObjectResp ();
1728
+ std::cout << " Location:" << resp.GetLocation () << std::endl;
1729
+ std::cout << " Bucket:" << resp.GetBucket () << std::endl;
1730
+ std::cout << " Key:" << resp.GetKey () << std::endl;
1731
+ std::cout << " ETag:" << resp.GetEtag () << std::endl;
1732
+ std::cout << " Crc64:" << resp.GetXCosHashCrc64Ecma () << std::endl;
1733
+ } else {
1734
+ std::cout << " MultiGetObjectAsync failed" << std::endl;
1735
+ std::cout << " ErrorMsg:" << context->GetResult ().GetErrorMsg () << std::endl;
1695
1736
}
1696
- std::cout << " ===================GetObjectAsync============================="
1697
- << std::endl;
1698
- PrintResult (handler->m_result , resp);
1699
- std::cout << " ========================================================"
1700
- << std::endl;
1701
1737
}
1702
1738
1703
1739
// 异步多上传对象,支持更新上传进度
1704
- void PutObjectAsync (qcloud_cos::CosAPI& cos, const std::string& bucket_name ,
1705
- const std::string& object_name ,
1706
- const std::string& local_file) {
1707
- qcloud_cos::MultiUploadObjectReq req (bucket_name, object_name, local_file);
1708
- qcloud_cos::MultiUploadObjectResp resp ;
1740
+ void MultiPutObjectAsync (qcloud_cos::CosAPI& cos,
1741
+ const std::string& bucket_name ,
1742
+ const std::string& object_name,
1743
+ const std::string& local_file) {
1744
+ qcloud_cos::MultiPutObjectReq req (bucket_name, object_name, local_file) ;
1709
1745
req.SetRecvTimeoutInms (1000 * 60 );
1710
1746
// 设置上传进度回调
1711
1747
req.SetTransferProgressCallback (&ProgressCallback);
1712
1748
// 设置上传状态回调
1713
- req.SetTransferStatusCallback (&StatusCallback );
1749
+ req.SetDoneCallback (&MultiPutObjectAsyncDoneCallback );
1714
1750
// 设置私有数据
1715
- req.SetTransferCallbackUserData (&req);
1751
+ req.SetUserData (&req);
1716
1752
1717
1753
// 开始上传
1718
- SharedTransferHandler handler = cos.PutObjectAsync (req, &resp );
1754
+ SharedAsyncContext context = cos.PutObjectAsync (req);
1719
1755
1720
1756
// 等待上传结束
1721
- handler->WaitUntilFinish ();
1757
+ std::cout << " wait finish..." << std::endl;
1758
+ context->WaitUntilFinish ();
1722
1759
1723
1760
// 检查结果
1724
- if (handler->m_result .IsSucc ()) {
1725
- std::cout << " PutObjectAsync Succ." << std::endl;
1726
- std::cout << " Etag:" << resp.GetEtag () << std::endl;
1761
+ if (context->GetResult ().IsSucc ()) {
1762
+ // 获取响应
1763
+ std::cout << " MultiPutObjectAsync succeed" << std::endl;
1764
+ std::cout << " Result:" << context->GetResult ().DebugString () << std::endl;
1765
+ MultiPutObjectResp resp = context->GetMultiPutObjectResp ();
1766
+ std::cout << " Location:" << resp.GetLocation () << std::endl;
1767
+ std::cout << " Bucket:" << resp.GetBucket () << std::endl;
1768
+ std::cout << " Key:" << resp.GetKey () << std::endl;
1769
+ std::cout << " ETag:" << resp.GetEtag () << std::endl;
1770
+ std::cout << " Crc64:" << resp.GetXCosHashCrc64Ecma () << std::endl;
1727
1771
} else {
1728
- std::cout << " PutObjectAsync Fail." << std::endl;
1729
- // 获取具体失败在哪一步
1730
- std::string resp_tag = resp.GetRespTag ();
1731
- if (" Init" == resp_tag) {
1732
- // print result
1733
- } else if (" Upload" == resp_tag) {
1734
- // print result
1735
- } else if (" Complete" == resp_tag) {
1736
- // print result
1737
- }
1772
+ std::cout << " MultiPutObjectAsync failed" << std::endl;
1773
+ std::cout << " ErrorMsg:" << context->GetResult ().GetErrorMsg () << std::endl;
1738
1774
}
1739
- std::cout << " ===================PutObjectAsync============================="
1740
- << std::endl;
1741
- PrintResult (handler->m_result , resp);
1742
- std::cout << " ========================================================"
1743
- << std::endl;
1744
1775
}
1745
1776
1746
1777
// 从目录上传文件
@@ -2600,7 +2631,7 @@ int main(int argc, char** argv) {
2600
2631
// // Copy(cos, bucket_name, "sevenyou_6G_diff_region_copy_part",
2601
2632
// "sevenyoutest-123456.cos.ap-beijing-1.myqcloud.com/sevenyou_6G");
2602
2633
2603
- // // MultiUploadObject(cos, bucket_name, "sevenyou_e2_multi",
2634
+ // MultiUploadObject(cos, bucket_name, "test", "/tmp/testfile10GB");
2604
2635
// "/data/sevenyou/temp/seven_50M.tmp.0925");
2605
2636
// //MultiUploadObject(cos, bucket_name, "sevenyou_1102_north_multi",
2606
2637
// "/data/sevenyou/temp/seven_50M.tmp.0925");
@@ -2803,8 +2834,8 @@ int main(int argc, char** argv) {
2803
2834
2804
2835
// async
2805
2836
// {
2806
- // PutObjectAsync (cos, bucket_name, "bigfile", "./bigfile");
2807
- // GetObjectAsync (cos, bucket_name, "bigfile", "./bigfile_download");
2837
+ // MultiPutObjectAsync (cos, bucket_name, "bigfile", "./bigfile");
2838
+ // MultiGetObjectAsync (cos, bucket_name, "bigfile", "./bigfile_download");
2808
2839
// }
2809
2840
2810
2841
// {
0 commit comments