OSS操作示例

2023-11-02

一、OSS API文档

https://www.alibabacloud.com/help/zh/doc-detail/103185.htm?spm=a2c63.l28256.b99.879.7d315cc5HEvVNn

二、demo

#ifndef _ALIBABACLOUD_HANDLE_
#define _ALIBABACLOUD_HANDLE_

#include <string>
#include <stdio.h>
#include <alibabacloud/oss/OssClient.h>
#include <memory>
#include <fstream>
#include <iostream>
using namespace AlibabaCloud::OSS;

namespace ALIBABACLOUD_HANDLE{

class alibabacloud_handle{
public:
    // desc: 构造函数用于初始化OSS账号信息以及初始化sdk
    // param: 参数一/AccessKeyId 参数二/AccessKeySecret 参数三/Endpoint 参数四/BucketName
    // return: NULL
    alibabacloud_handle(const std::string &,const std::string &,const std::string &,const std::string &);

    // desc: 关闭sdk
    // param: NULL
    // return: NULL
    ~alibabacloud_handle();

    // desc: 上传文件
    // param: 参数一/阿里云上的路径及要保存的文件名 参数二/本地路径
    // return: 成功返回true,失败返回false
    bool upload_files(const std::string &,const std::string &);

    // desc: 查询阿里云某路径下的文件列表
    // param: 参数一/阿里云上的路径
    // return: 成功返回true,失败返回false
    bool query_directory(const std::string &);

    // desc: 下载文件到本地路径下
    // param: 参数一/阿里云上的路径及要保存的文件名 参数二/本地路径
    // return: 成功返回true,失败返回false
    bool download_files(const std::string &,const std::string &);

    // desc: 下载文件到内存中
    // param: 参数一/阿里云上的路径及要保存的文件名 参数二/保存数据的字符串
    // return: 成功返回true,失败返回false
    bool download_files_to_memory(const std::string &,std::string &);

    // desc: 进度条显示
    // param: transfered/已完成的大小 total/总大小
    // return: NULL
    void ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData) const;

public:
    int status;

private:
    //OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。
    std::string AccessKeyId;
    std::string AccessKeySecret;
    std::string Endpoint;       //OSS对外服务的访问域名
    std::string BucketName;     //存储空间名
    ClientConfiguration conf;
    OssClient *oss_client;
    TransferProgress progressCallback;
    const char lable[5] = {'|','/','-','\\','\\'};
};
}
#endif

#include "alibabacloud_handle.h"
#ifndef Q_OS_LINUX
#include <unistd.h>
#endif
#include <string.h>

namespace ALIBABACLOUD_HANDLE{
alibabacloud_handle::alibabacloud_handle(const std::string &AccessKeyId,
                                         const std::string &AccessKeySecret,
                                         const std::string &Endpoint,
                                         const std::string &BucketName)
    : AccessKeyId(AccessKeyId),
      AccessKeySecret(AccessKeySecret),
      Endpoint(Endpoint),
      BucketName(BucketName)
{
    InitializeSdk();

    /* 设置连接池数,默认为16个 */
    conf.maxConnections = 20;

    /* 设置请求超时时间,超时没有收到数据就关闭连接,默认为10000ms */
    conf.requestTimeoutMs = 8000;

    /* 设置建立连接的超时时间,默认为5000ms */
    conf.connectTimeoutMs = 8000;

    oss_client = new OssClient(Endpoint, AccessKeyId, AccessKeySecret, conf);
    if(oss_client == NULL){
        status = -1;
        return;
    }else{
        status = 1;
    }

    auto callback = std::bind(&alibabacloud_handle::ProgressCallback,this,
                              std::placeholders::_1,
                              std::placeholders::_2,
                              std::placeholders::_3,
                              std::placeholders::_4
                              );
    progressCallback = {  callback , nullptr };

}

alibabacloud_handle::~alibabacloud_handle(){
    ShutdownSdk();
}

bool alibabacloud_handle:: upload_files(const std::string &target_path, const std::string &local_path){

    std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(local_path.c_str(), std::ios::in|std::ios::binary);
    PutObjectRequest request(BucketName, target_path, content);

    request.setTransferProgress(progressCallback);
    auto outcome = oss_client->PutObject(request);

    if (!outcome.isSuccess()) {
        /* 异常处理 */
        std::cout << "PutObject fail" <<
                     ",code:" << outcome.error().Code() <<
                     ",message:" << outcome.error().Message() <<
                     ",requestId:" << outcome.error().RequestId() << std::endl;
        return false;
    }
    return true;
}


bool alibabacloud_handle::query_directory(const std::string &target_directory){
    std::string nextMarker = "";

    ListObjectsRequest request1(BucketName);
    auto outcome = oss_client->ListObjects(request1);
    do {
        /* 列举文件 */
        ListObjectsRequest request(BucketName);
        /* 设置正斜线(/)为文件夹的分隔符 */
        request.setDelimiter("/");
        request.setPrefix(target_directory);
        request.setMarker(nextMarker);
        outcome = oss_client->ListObjects(request);

        if (!outcome.isSuccess ()) {
            /* 异常处理 */
            std::cout << "ListObjects fail" <<
                         ",code:" << outcome.error().Code() <<
                         ",message:" << outcome.error().Message() <<
                         ",requestId:" << outcome.error().RequestId() << std::endl;
            return false;
        }
        for (const auto& object : outcome.result().ObjectSummarys()) {
            std::cout << "object"<<
                         ",name:" << object.Key() <<
                         " ,size:" << object.Size() <<
                         " ,lastmodify time:" << object.LastModified() << std::endl;
        }
        for (const auto& commonPrefix : outcome.result().CommonPrefixes()) {
            std::cout << "commonPrefix" << ",name:" << commonPrefix << std::endl;
        }
        nextMarker = outcome.result().NextMarker();
    } while (outcome.result().IsTruncated());


    return true;
}

bool alibabacloud_handle::download_files(const std::string &target_directory,const std::string &local_directory){

    DownloadObjectRequest request(BucketName, target_directory, local_directory);
    request.setTransferProgress(progressCallback);

    auto outcome = oss_client->ResumableDownloadObject(request);

    if (!outcome.isSuccess()) {
        /* 异常处理 */
        std::cout << "ResumableDownloadObject fail" <<
                     ",code:" << outcome.error().Code() <<
                     ",message:" << outcome.error().Message() <<
                     ",requestId:" << outcome.error().RequestId() << std::endl;
        return false;
    }else{
        return true;
    }

}


void alibabacloud_handle::ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData) const
{
    int i = (int)((transfered*1.0/total*1.0) *100);
    printf("[%d%%][%c]\r", i , lable[i % 4]);
    fflush(stdout);
}

bool alibabacloud_handle::download_files_to_memory(const std::string &target_directory,std::string &buf){
    GetObjectRequest request(BucketName, target_directory);

    request.setTransferProgress(progressCallback);

    auto outcome = oss_client->GetObject(request);
    if (outcome.isSuccess()) {
        std::cout << "getObjectToBuffer" << " success, Content-Length:" << outcome.result().Metadata().ContentLength() << std::endl;
        *(outcome.result().Content()) >> buf;
    }
    else {
        /*异常处理*/
        std::cout << "getObjectToBuffer fail" <<
                     ",code:" << outcome.error().Code() <<
                     ",message:" << outcome.error().Message() <<
                     ",requestId:" << outcome.error().RequestId() << std::endl;
        return false;
    }
    return true;
}

} // namespace end

// 测试

void test_alibabacloud_handle()
{

    std::string AccessKeyId = "yourAccessKeyId ";
    std::string AccessKeySecret = "yourAccessKeyId";
    std::string Endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    std::string BucketName = "yourBucketName";

    ALIBABACLOUD_HANDLE::alibabacloud_handle *p =
            new ALIBABACLOUD_HANDLE::alibabacloud_handle(AccessKeyId, AccessKeySecret, Endpoint, BucketName);

    if( p->status == -1) {
        printf("alibabacloud_handle  constructor error\n");
        return;
    }

    bool flag  = false;

     //上传文件
#if 0
     flag = p->upload_files("test_upload.zip", "./test_upload.zip");
     if(false == flag ){
         perror("upload files to oss failed.\n");
     }else{
         std::cout << "upload success.." << std::endl;
     }
#endif

     //查询文件夹中文件
     flag = p->query_directory("");
     if(false == flag ){
         perror("list files to oss failed.\n");
     }else{
         std::cout << "list files success.." << std::endl;
     }

#if 0
    //下载文件到本地路径
    const std::string srcFilename = "oss_test.zip";
    const std::string local_directory = "./test.zip";
    p->download_files(srcFilename,local_directory);
#endif

#if 0
    //下载文件到本地内存
    std::string p_buf;
    p->download_files_to_memory("XXX/XXX/XXX",p_buf);
    std::cout << p_buf << std::endl;
#endif

    if ( p != NULL)
    {
        delete p;
    }
}

另:可以通过OSS浏览器工具辅助验证~
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OSS操作示例 的相关文章

随机推荐

  • 一文看懂异步 FIFO 架构(三) 双时钟的异步 FIFO

    目录 工作原理 方向标志 方向标志的实现 计算满和空 结论 往期系列博客 在本系列的第一篇文章中 我们看到了 FIFO 的一般架构 并分析了一个时钟的简单情况 该系列的第二部分描述了一种可能的双时钟设计的架构 在第三部分中 我们将探索另一种
  • Window操作系统基本知识

    windows系统 kernel32 dll是Windows 系统中非常重要的32位动态链接库文件 属于内核级文件 它控制着系统的内存管理 数据的输入输出操作和中断处理 当Windows启动时 kernel32 dll就驻留在内存中特定的写
  • 【CSS】滚动条样式详解

    只总结webkit的 IE与firefox暂不做记录 呼出与关闭滚动条 1 如果是浏览器的滚动条 其依赖的是html标签 我们不需要设置 内容溢出会自动出现 对html标签的溢出样式隐藏即可 html overflow x hidden 隐
  • 集合竞价规则及集合竞价的产生条件

    了解一下集合竞价规则 对于股民来说 是非常重要的 否则连一些基本的定义都了解不清楚的话 那么就麻烦了 下面为你介绍一下集合竞价规则以及集合竞价的产生条件 如果想要了解更多集合竞价方面的知识 敬请关注QR量化投资社区 下面让我们了解一下集合竞
  • 引入flutter module,运行时flutter_webview_plugin报错:Unhandled Exception: MissingPluginException

    异常信息 Android原生项目引入了一个flutter module flutter module用到了一个flutter写的sdk sdk需要使用webview来执行js代码 因此sdk引用了flutter webview plugin
  • mysql 分区表合并_MySQL 合并表、分区表

    合并表 合并表示一种早期的 简单的分区实现 在未来可能被淘汰 不推荐使用 限制 合并表和子表的字段 索引要完全相同 即使子表上有主键限制 合并表中仍然会出现重复值 如果删除其中一个子表 表可能还存在 带只能通过合并表访问 视操作系统而定 合
  • @GetMapping 接多个参数的写法

    后面拼接接着拼接上去就行了 此上方面针对于 接收多个未知参数 但是针对有很多需要模糊查询的方面 如果 我们所需要的接收的参数 是我们实体类对象的话 就不需要这么麻烦了 直接带入实体类对象 用即可
  • qt 串口通信

    qt串口通信 需要用到QSerialport类 1 pro文件中添加QT serialport 2 获取当前有哪些串口设备 QSerialPortInfo availablePorts 3 设置要打开的串口 setPortName 然后打开
  • 前端人员学习postman

    前端人员使用postman postman介绍 下载安装 posman的基本操作 主要进的是如何新建一个文件夹 然后新建请求 postman发送不同请求 讲的是如何发送不同类型的请求 发送get请求 发送post请求 body里面数据类型的
  • 人工智能科技成熟的11个Github上免费开源项目,很多电影中才有的场景应用到现实颠覆普通人的认知和想象

    人工智能科技成熟的11个Github上免费开源项目 很多电影中才有的场景应用到现实颠覆普通人的认知和想象 全文大纲 PULSE 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化 Depix 给打了马赛克的文字去码 TecoGAN 给
  • Wireshark数据抓包分析之ARP协议

    目录 预备知识 1 知识储备 2 什么是ARP 3 ARP工作流程 4 ARP缓存表 实验目的 实验环境 实验步骤一 实验步骤二 实验步骤三 预备知识 1 知识储备 推荐两本好书 TCP IP详解卷1 http www pc6 com so
  • 两相混合步进电机(简单驱动器)simulink仿真

    1 目的 主要是控制步进电机的正反转以及周期性的转动一个步距角度 驱动模式为整步4拍不涉及到对转速的控制 比较基础 其次比较着重于对模型的分析 如有错误 这里欢迎大佬们指出 推荐先看一下以下的论文 基于simulink的步进电机控制系统仿真
  • MySQL 删除表中的数据记录

    文章目录 前言 一 删除表中的数据记录 1 删除特定数据记录 2 删除所有数据记录 总结 前言 删除数据记录是数据操作中常见的操作 可以删除表中已经存在的数据记录 在MySQL中可以通过DELETE语句来删除数据记录 该SQL语句可以通过以
  • JAVA中extends 与implements区别

    http www cnblogs com hnrainll archive 2011 10 11 2207773 html JAVA中extends 与implements有啥区别 1 在类的声明中 通过关键字extends来创建一个类的子
  • 爬取豆瓣电影排行榜top 250

    coding utf 8 import requests import re os 爬取豆瓣250 def douban ranking start 构建请求 param start start filter respon requests
  • 使用VS Code断点调试PHP

    vs code 使用一款杰出的轻量级代码编辑器 其中的插件工具不胜枚举而且还在不断增加 使用 vs code 调试 php 代码更是方便简洁 下面我们来一起看一下 1 安装 XDebug 扩展 调试 php 代码最常用的就是 XDebug
  • python:ezdxf——如何使用

    官方文档 https ezdxf readthedocs io en master howto index html 文章目录 一 基本文件 1 设置 获取标头变量 2 设置DXF绘图单元 3 创建更具可读性的DXF文件 DXF漂亮打印机
  • 下载vant源码在本地查看小程序模版

    官网地址 Vant地址 运行 git clone git github com youzan vant weapp git cd vant weapp npm install npm run dev 接着打开微信开发者工具 导入exampl
  • Rethinking BiSeNet For Real-time Semantic Segmentation

    Rethinking BiSeNet For Real time Semantic Segmentation 摘要 BiSeNet已经被证明是一种流行的实时分割的双流网络 然而 其增加额外路径来编码空间信息的原理是耗时的 并且从预训练的任务
  • OSS操作示例

    一 OSS API文档 https www alibabacloud com help zh doc detail 103185 htm spm a2c63 l28256 b99 879 7d315cc5HEvVNn 二 demo ifnd