本章讲的是两种上传文件到oss的方式
我使用的是vs2017 IDE
安装C++SDK的过程:
安装 CMake。打开 cmd 进入 SDK 文件目录,创建 build 文件夹,运行cmake …生成所需文件,如果要构建 x64 体系结构,可以使用命令 cmake -A x64 …来实现。再用 Visual Studio 打开 alibabacloud-oss-cpp-sdk.sln 生成解决方案。生成lib和dll文件即可。
依赖库分debug和release版本。
需要分别编译。
导库:
包含目录
库目录:
库名:
#include <iostream>
#include <alibabacloud/oss/OssClient.h> //oss库
using namespace std;
using namespace AlibabaCloud::OSS;
void uploadoss(String &str)
{
/* 初始化OSS账号信息 */
std::string AccessKeyId = "*****";
std::string AccessKeySecret = "****";
std::string Endpoint = "oss-cn-beijing.aliyuncs.com"; //图片访问地址域名地址
std::string BucketName = "yourBucketName"; //你的bucket名字
std::string ObjectName = "images/" + str; //oss文件+文件名
/* 初始化网络等资源 */
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
/* 上传文件 */
auto outcome = client.PutObject(BucketName, ObjectName, "../1.jpg");//本地文件地址
if (!outcome.isSuccess()) {
/* 异常处理 */
std::cout << "CreateBucket fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return;
}else
{
cout<<"send successful!"<<endl;
}
/* 释放网络等资源 */
ShutdownSdk();
return;
}
//内存上传
void uploadoss(String &picname, stringstream &picstream)
{
/* 初始化OSS账号信息 */
std::string AccessKeyId = "****";
std::string AccessKeySecret = "***";
std::string Endpoint = "oss-cn-beijing.aliyuncs.com"; //图片访问地址域名地址
std::string BucketName = "yourBucketName"; //
std::string ObjectName = "images/" + picname;
/* 初始化网络等资源 */
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << picstream.str();
PutObjectRequest request(BucketName, ObjectName, content);
/*(可选)请参见如下示例设置存储类型及访问权限ACL* /
//request.MetaData().addHeader("x-oss-object-acl", "private");
//request.MetaData().addHeader("x-oss-storage-class", "Standard");
/* 上传文件 */
auto outcome = client.PutObject(request);
if (!outcome.isSuccess()) {
/* 异常处理 */
std::cout << "CreateBucket fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return;
}else
{
cout << "send successful! " << endl;
}
/* 释放网络等资源 */
ShutdownSdk();
return;
}
int main()
{
//本地上传
String picname = "filename.jpg";
uploadoss(picname);
//内存上传
stringstream liu;
for(int i=0;i<10;i++)
{
liu<<i;
}
//至此,信息已经在这个sstream流里;
String picname2 = "1.txt";
uploadoss(picname2,liu);
return 0;
}
至此。成功上传oss
在运行文件目录下添加下面两个dll,否则会弹出缺少dll
如:Debug目录下
下面再给一个QT使用oss的配置教程:
注意要版本一致。和vs使用类似,我就不多说了。
我就只讲配置使用的部分:
需要添加4个lib和3个文件使用路径:
下面给一个pro:
QT -= gui
QT += network
CONFIG += c++11 console
CONFIG -= app_bundle
CONFIG += debug_and_release
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp \
sendoss.cpp
HEADERS += \
sendoss.h
#oss
INCLUDEPATH += $$PWD/workneed/aliyun-oss-cpp-sdk-master/sdk/include \
$$PWD/workneed/aliyun-oss-cpp-sdk-master/sdk/src \
$$PWD/workneed/aliyun-oss-cpp-sdk-master/third_party/include
CONFIG(debug, debug|release) {
LIBS += -L$$PWD/workneed/debuglib/ -lalibabacloud-oss-cpp-sdk
LIBS += -L$$PWD/workneed/debuglib/ -llibcurl
LIBS += -L$$PWD/workneed/debuglib/ -lssleay32
LIBS += -L$$PWD/workneed/debuglib/ -llibeay32
}else{
LIBS += -L$$PWD/workneed/releaselib/ -lalibabacloud-oss-cpp-sdk
LIBS += -L$$PWD/workneed/releaselib/ -llibcurl
LIBS += -L$$PWD/workneed/releaselib/ -lssleay32
LIBS += -L$$PWD/workneed/releaselib/ -llibeay32
}
我使用的例子是x64+release编译的。你们应用的时候需要生成所对应的阿里云oss-lib。
更新:2020-8-25
我封装了一个oss使用类,大家也可以改成自己所需要的:
可c++或者qt
我用的qt封装的。
把打印语句替换即可。日志用的spdlog库,参考我的其他文章
下面我给的是连接和发送图片的。
头文件:
/**
* @desc 阿里云oss部分
* @author wqj
* @2020年8月7日
*/
#ifndef SENDOSS_H
#define SENDOSS_H
#include <QDebug>
#include <alibabacloud/oss/OssClient.h>
#include "spdlog/spdlog.h"
#include <sstream> //流
#include <iostream>
using std::stringstream;
using std::string;
using namespace spdlog;
using namespace AlibabaCloud::OSS;
class SendOSS
{
public:
SendOSS();
std::shared_ptr<spdlog::logger> oss_logger;
bool bislinkoss;
void linkoss();
void sendtoOSS(const string &picname,const stringstream &picstream,const string &expressNo);
private:
int uploadOSSnum;
OssClient *oss_client;
//init
std::string ossaccount,osspassword,ossaddress,BucketName;
};
#endif // SENDOSS_H
cpp文件:
#include "sendoss.h"
#include <QSettings>
SendOSS::SendOSS()
{
//初始化oss配置
QSettings *initconfig=new QSettings("./config.ini",QSettings::IniFormat);
ossaccount =initconfig->value("OSS/account").toString().toStdString();
osspassword =initconfig->value("OSS/password").toString().toStdString();
ossaddress =initconfig->value("OSS/address").toString().toStdString();
BucketName =initconfig->value("OSS/BucketName").toString().toStdString();
delete initconfig;//读取完成删除指针
bislinkoss = false;
uploadOSSnum = 0;
}
void SendOSS::linkoss()
{
// 初始化网络等资源
InitializeSdk();
//连接
ClientConfiguration conf;
oss_client = new OssClient(ossaddress , ossaccount , osspassword , conf);
if (oss_client == NULL)
{
bislinkoss = false;
qDebug()<<"link oss failed";
//打印日志
oss_logger->info("连接oss失败!!!!!!!");
oss_logger->flush();
}
else
{
bislinkoss = true;
qDebug()<<"link oss success";
//打印日志
oss_logger->info("连接oss成功!!!!!!!");
oss_logger->flush();
}
}
void SendOSS::sendtoOSS(const string &picname, const stringstream &picstream, const string &expressNo)
{
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << picstream.str();//图片数据流
PutObjectRequest request(BucketName, picname, content);
/* 上传文件 */
auto outcome = oss_client->PutObject(request);
if (!outcome.isSuccess()) {
/* 异常处理 */
std::cout << "CreateBucket fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
bislinkoss = false;
oss_logger->info("上传oss失败!数量:{0},运单号:{1}",uploadOSSnum,expressNo);
oss_logger->flush();
}else
{
uploadOSSnum+=1;
oss_logger->info("上传oss成功!数量:{0},运单号:{1}",uploadOSSnum,expressNo);
oss_logger->flush();
}
return;
}