一、OSS C++ SDK下載
官方提供了主流語言的 SDK 源碼以及示例代碼在SDK示例簡介,但我們只介紹 C++ 版本的。
OSS C++ SDK 源碼的下載鏈接為:aliyun-oss-cpp-sdk
OSS C++ SDK 也提供了豐富的示例代碼,方便參考或直接使用:SDK示例代碼
二、CMake編譯
下載后的aliyun-oss-cpp-sdk要使用 CMake 編譯,這個 SDK 沒有任何庫依賴,CMake 很簡單,就是使用 cmake-gui 添加 CMakeLists 所在目錄和下一級的 build 目錄,點擊 configure 和 generate 按鈕即可生成 .sln 工程,再使用 VS 編譯即可生成所需要的靜態庫。這里編譯的是 VS2019 64 位的,如下圖所示(編譯也可以參考OSS C++ SDK安裝):

三、創建工程、列舉文件示例
新建一個項目 - ossExample,切換為 64 位,拷貝添加aliyun-oss-cpp-sdk-master\sdk\include\alibabacloud\oss目錄下的頭文件到工程新建的 include 目錄下, 然后添加aliyun-oss-cpp-sdk-master\build\lib\Debug和aliyun-oss-cpp-sdk-master\third_party\lib\x64目錄下的庫文件到新建的 lib 目錄下。
在附加包含目錄處添加拷貝后的頭文件所在路徑,在附加庫目錄處添加 .lib 文件所在路徑,在附加依賴項處添加 .lib 文件(alibabacloud-oss-cpp-sdk.lib、libcurl.lib、libeay32.lib、ssleay32.lib),配置完成之后添加 mian.cpp。詳細圖文步驟可以參考:使用阿里雲 OSS C++ SDK
列舉文件
存儲空間是 OSS 全局命名空間,相當於數據的容器,可以存儲若干文件。 以下代碼用於新建一個存儲空間(main.cpp):
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號信息 */
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
std::string Endpoint = "yourEndpoint";
std::string BucketName = "yourBucketName";
/* 初始化網絡等資源 */
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
/* 列舉文件 */
ListObjectsRequest request(BucketName);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 異常處理 */
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
else {
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
}
/* 釋放網絡等資源 */
ShutdownSdk();
return 0;
}
OSS 賬號信息改寫成你本人的信息。第一次運行會報錯缺少動態庫,將動態庫(libcurl.dll、libeay32.dll、ssleay32.dll、zlibwapi.dll)考到輸出 debug 目錄下,正常運行。
上面只列舉了一個 OSS C++ SDK 的示例-列舉文件,更多示例請參考:
四、封裝OSS操作類
下面將實現對 OSS 的常見操作函數並封裝成類 - OssOperate。
OssOperate.h
#pragma once
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
// OSS操作類
class OssOperate
{
public:
// 單例模式(最推薦的懶漢式,線程安全)
static OssOperate &GetInstance() {
static OssOperate m_instance;
return m_instance;
}
// 創建存儲空間
bool createBucket();
// 上傳文件
bool upload(std::string objectName, std::string localName);
// 下載文件
bool download(std::string objectName, std::string nameToSave);
// 刪除文件
bool delFile(std::string objectName);
// 列舉文件
bool listObjects();
private:
// 構造函數定義為 private,這就保證了必須通過GetInstance方法才能獲取到唯一的m_instance實例
OssOperate();
// OSS客戶端
OssClient *m_client;
// OSS賬號信息
std::string m_accessKeyId;
std::string m_accessKeySecret;
std::string m_endpoint;
std::string m_bucketName;
};
OssOperate.cpp
#include "OssOperate.h"
OssOperate::OssOperate()
{
// 初始化OSS賬號信息
m_accessKeyId = "yourAccessKeyId";
m_accessKeySecret = "yourAccessKeySecret";
m_endpoint = "yourEndpoint";
m_bucketName = "yourBucketName";
// yourObjectName表示上傳文件到OSS時需要指定包含文件后綴在內的完整路徑,例如test/123.png
std::string ObjectName = "test/test555.png";
// 初始化OSS客戶端
ClientConfiguration conf;
m_client = new OssClient(m_endpoint, m_accessKeyId, m_accessKeySecret, conf);
// 初始化網絡等資源
InitializeSdk();
}
// 創建存儲空間
bool OssOperate::createBucket()
{
// 指定新創建bucket的名稱、存儲類型和ACL
CreateBucketRequest request(m_bucketName, StorageClass::IA, CannedAccessControlList::PublicReadWrite);
// 創建bucket
auto outcome = m_client->CreateBucket(request);
if (!outcome.isSuccess()) {
// 異常處理
std::cout << "CreateBucket fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return false;
}
// 釋放網絡等資源
ShutdownSdk();
return true;
}
// 上傳文件
bool OssOperate::upload(std::string objectName, std::string localName)
{
// yourLocalFilename由本地文件路徑加文件名包括后綴組成,例如C:\\Users\\feng\\Desktop\\123.png
auto outcome = m_client->PutObject(m_bucketName, objectName, localName);
// 異常處理
if (!outcome.isSuccess()) {
std::cout << "PutObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return false;
}
// 釋放網絡等資源
ShutdownSdk();
return true;
}
// 下載文件
bool OssOperate::download(std::string objectName, std::string nameToSave)
{
// 獲取文件到本地文件
DownloadObjectRequest request(m_bucketName, objectName, nameToSave);
auto outcome = m_client->ResumableDownloadObject(request); // 官方的下載代碼報錯,這里改寫了
if (outcome.isSuccess()) {
std::cout << "GetObjectToFile success, ContentLength is" << outcome.result().Metadata().ContentLength() << std::endl;
}
else {
// 異常處理
std::cout << "GetObjectToFile fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return false;
}
// 釋放網絡等資源
ShutdownSdk();
return true;
}
// 刪除文件
bool OssOperate::delFile(std::string objectName)
{
// 刪除操作
DeleteObjectRequest request(m_bucketName, objectName);
auto outcome = m_client->DeleteObject(request);
if (!outcome.isSuccess()) {
// 異常處理
std::cout << "DeleteObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
// 釋放網絡等資源
ShutdownSdk();
return true;
}
// 列舉文件
bool OssOperate::listObjects()
{
ListObjectsRequest request(m_bucketName);
auto outcome = m_client->ListObjects(request);
if (!outcome.isSuccess()) {
// 異常處理
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return false;
}
else {
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object" <<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
}
// 釋放網絡等資源
ShutdownSdk();
return true;
}
main.cpp
#include "OssOperate.h"
int main(void)
{
// 上傳文件
OssOperate::GetInstance().upload("test/123.png", "C:\\Users\\feng\\Desktop\\test555.png");
// 下載文件
OssOperate::GetInstance().download("test/123.png", "C:\\Users\\feng\\Desktop\\456.png");
// 刪除文件
OssOperate::GetInstance().delFile("test/123.png");
// 列舉文件
OssOperate::GetInstance().listObjects();
return 0;
}
