使用c++对阿里云OSS SDK进行封装,实现查询文件夹、上传文件、下载文件到内存和本地路径下等功能,并附赠进度条

2023-05-16

最近工作中遇到需要将文件上传到阿里云的oss服务器上,所以根据阿里云的说明文档,封装了一个类,希望对大家有所帮助,如发现问题,欢迎批评指正~

主要功能:
(1)设置连接池数,设置请求超时时间,设置建立连接的超时时间
(2)进度条显示实时进度
(3)上传文件,下载文件到内存中和到本地路径下

alibabacloud_handle.h

#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

alibabacloud_handle.cpp

#include "alibabacloud_handle.h"
#include <unistd.h>
#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),lable({'|','/','-','\\','\\'})
{
    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;
}
}

main.cpp

#include "alibabacloud_handle.h"
int main(){
    ALIBABACLOUD_HANDLE::alibabacloud_handle *p = new ALIBABACLOUD_HANDLE::alibabacloud_handle("xxx", "xxx", "http://oss-cn-shenzhen.aliyuncs.com", "xxx");
    if(p->status == -1){
		printf("alibabacloud_handle  constructor error\n");
		exit(-1);
	}
	//上传文件
    p->upload_files("XXX/XXX/XXX", "XXX/XXX/XXX");
    //查询文件夹中文件
    p->query_directory("XXX/XXX/XXX");
    //下载文件到本地路径
    p->download_files("XXX/XXX/XXX","./XXX.txt");
    //下载文件到本地内存
    std::string p_buf;
    p->download_files_to_memory("XXX/XXX/XXX",p_buf);
    std::cout << p_buf << std::endl;
    
    if (p != NULL)
    {
        delete p;
    }
}

参考:

https://help.aliyun.com/document_detail/106556.html?spm=a2c4g.11186623.6.926.75cb4176w686Pc

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

使用c++对阿里云OSS SDK进行封装,实现查询文件夹、上传文件、下载文件到内存和本地路径下等功能,并附赠进度条 的相关文章

  • 【分享】高精度RTK定位解决方案

    高精度RTK定位系统采用高精度定位标签 xff0c 通过计算机技术 地理信息技术 移动定位技术 通信技术 网络技术 xff0c 为生产现场作业人员配发定位终端 xff0c 实时追踪其位置信息进行相关管控 xff0c 为其活动提供安全技术保障
  • 【分享】5G+北斗RTK高精度人员定位解决方案

    5G 43 北斗RTK高精度定位系统旨在通过5G网络实时提供亚米级 厘米级 毫米级高精度定位服务 xff0c 构建全天候 全天时 全地理的精准时空服务体系 伴随着信息技术日新月异的发展 xff0c 各类 智慧 顺势而出 xff0c 智慧城市
  • 5G+北斗RTK定位:高精度定位技术发展更进一步

    5G 43 北斗RTK定位采用5G定位与北斗RTK定位技术 xff0c 在信号 信息 设施 应用等层面深度融合 xff0c 5G自身可实现亚米级的定位能力与北斗形成信号覆盖互补 xff0c 实现从室内到室外无缝隙衔接与定位 5G通信技术的到
  • 室外定位:高精度北斗RTK定位技术

    北斗RTK定位技术 xff0c 也称北斗差分定位技术 xff0c 利用我国自主研发的北斗卫星定位系统实现精确定位功能 定位精度可根据需要 xff0c 通过选择不同精度的人员定位终端来实现 在科技强国的战略驱动下 xff0c 北斗RTK定位技
  • 【高精度定位】RTK定位与RTD定位知识科普

    高精度定位一般指亚米级别或厘米级别的定位 xff0c 常见的室内有蓝牙AoA和UWB两种技术 xff0c 室外有北斗地基增强技术 xff0c 这些技术都是采用算法进行定位 工业4 0时代 xff0c 在资源和环境约束不断强化的背景下 xff
  • curl http或https上传下载

    curl的使用 注意如果是https请求需要带上ssl的库和curl库如下图 上传文件 回调函数 span class token keyword static span size t span class token function h
  • 层次遍历构建二叉树

    span class hljs keyword struct span TreeNode span class hljs keyword int span val span class hljs keyword struct span Tr
  • Jetson tx2 使用 jetpack 4.3刷机全过程

    1 首先准备一台安装有ubuntu 18 04 ubuntu16 04 系统的主机 xff08 host也就是笔记本 xff09 2 在nvidia官网注册一个nvidia的账号用于下载jetpack 4 3时使用 xff08 刷机过程中需
  • 2020/2/21 Linux Socket编程 高级篇——广播

    广播 xff1a 实现一对多的通信 SO BROADCAST选项 它控制了UDP套接字是否能发广播数据报 xff0c 选项类型是int xff0c 非零表示 是 只有UDP能用 xff0c TCP不能 如果是一个广播地址 xff0c 但SO
  • 大小端字节序(Big Endian和Little Endian)

    那么何为字节序 xff08 Endia xff09 呢 xff1f Big Endian是指低地址存放最高有效字节 xff08 MSB xff09 xff0c 而Little Endian则是低地址存放最低有效字节 xff08 LSB xf
  • GPS定位及通信协议解析

    1 简介 上图为某公司的GPS定位模块 xff0c 自己在使用其进行GPS定位过程中学习到的知识分享给大家 主要参数如下 半双工 UART 3 3V TTL 电平 RS232 IIC CAN 接口输出 xff0c 更快速的应用 xff1b
  • JVM系列(八):堆(Heap)的相关知识介绍

    目录 1 JVM堆的概念 2 JVM堆的特点 3 JVM堆的内部结构 3 1 组成 3 2 堆内存内部空间所占比例 3 3 永久代和元空间区别 4 堆空间的大小设置 5 堆空间垃圾回收 1 JVM堆的概念 JVM中的堆是用来存放对象的内存空
  • C++读写TIF格式

    参考文章 xff1a xff08 1 xff09 https www cnblogs com gywei p 3393816 html xff08 2 xff09 https blog csdn net han jiang xue arti
  • matlab Fourier变换--方波信号的分解与重建

    N 61 200 采用的数据点数 dt 61 4 N 采样的间隔 for n 61 1 N 生成一个方波 if n dt gt 61 2 x n 61 0 8 else x n 61 0 8 end end figure subplot 2
  • matlab 小波分析--高通滤波器和低通滤波器

    xff08 一 xff09 加载一个尺度滤波器 load db8 w 61 db8 figure subplot 4 2 1 stem w title 39 原尺度滤波器 39 计算4个滤波器 Lo D Hi D Lo R Hi R 61
  • C/C++中rand() 函数产生随机数与srand()设置随机数种子

    xff08 1 xff09 rand 产生随机数 xff0c 输出的随机数序列是确定的 xff0c 即每次运行结果一致 include lt iostream gt int main int i j for i 61 0 i lt 10 i
  • matlab与数字图像处理--膨胀和腐蚀

    对于初学者 xff0c 参考一篇很好的说明 xff1a https blog csdn net alw 123 article details 83868878 左边是一个二值化的测试图像 xff0c 白色为图像元素 xff0c 黑色为背景
  • Emmet语法

    Emmet语法 1 1 快速生成HTML结构语法1 2 快速生成CSS样式语法1 3 快速格式化代码 Emmet语法的前身是Zen coding 它使用缩写 来提高html css的编写速度 Vscode内部已经集成该语法 快速生成HTML
  • CString,int,string,char*之间的转换

    C 43 43 标准函数库 中说的 有三个函数可以将字符串的内容转换为字符数组和C string 1 data 返回没有 0 的字符串数组 2 c str xff0c 返回有 0 的字符串数组 3 xff0c copy int 转 CStr
  • C++ TCP网络编程--服务器端多线程处理会话连接

    客户端程序 xff1a include lt winsock h gt include lt iostream gt pragma comment lib 34 ws2 32 lib 34 include lt Windows h gt i

随机推荐