最近工作中遇到需要将文件上传到阿里云的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:
alibabacloud_handle(const std::string &,const std::string &,const std::string &,const std::string &);
~alibabacloud_handle();
bool upload_files(const std::string &,const std::string &);
bool query_directory(const std::string &);
bool download_files(const std::string &,const std::string &);
bool download_files_to_memory(const std::string &,std::string &);
void ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData) const;
public:
int status;
private:
std::string AccessKeyId;
std::string AccessKeySecret;
std::string Endpoint;
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();
conf.maxConnections = 20;
conf.requestTimeoutMs = 8000;
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(使用前将#替换为@)