zoukankan      html  css  js  c++  java
  • 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-mastersdkincludealibabacloudoss目录下的头文件到工程新建的 include 目录下, 然后添加aliyun-oss-cpp-sdk-masteruildlibDebugaliyun-oss-cpp-sdk-master hird_partylibx64目录下的库文件到新建的 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;
    }
    

  • 相关阅读:
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q100-Q103)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q91-Q93)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q88-Q90)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q85-Q87)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q81-Q84)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q77-Q80)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q73-Q76)
    Sharepoint学习笔记—习题系列--70-573习题解析 -(Q70-Q72)
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/14497266.html
Copyright © 2011-2022 走看看