OSS C++ SDK使用總結


一、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安裝):

OSS_CMakeSdk_A.png


三、創建工程、列舉文件示例

新建一個項目 - ossExample,切換為 64 位,拷貝添加aliyun-oss-cpp-sdk-master\sdk\include\alibabacloud\oss目錄下的頭文件到工程新建的 include 目錄下, 然后添加aliyun-oss-cpp-sdk-master\build\lib\Debugaliyun-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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM