本章讲的是两种上传文件到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;
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐