OSS C++ SDK使用总结

时间:2024-02-18 11:42:14

一、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;
}