C++ 接口

AWS-S3 C++ SDK 编译

sudo yum install -y openssl openssl-devel curl-devel
wget https://github.com/aws/aws-sdk-cpp/archive/1.0.164.tar.gz
tar zxf aws-sdk-cpp-1.0.164.tar.gz
cd aws-sdk-cpp-1.0.164
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j3 -C aws-cpp-sdk-core
make -j3 -C aws-cpp-sdk-s3
sudo make install -C aws-cpp-sdk-core
sudo make install -C aws-cpp-sdk-s3

C++ 代码示例

#include <iostream>
#include <fstream>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <aws/s3/model/CreateBucketRequest.h>
#include <aws/s3/model/DeleteBucketRequest.h>
#include <aws/s3/model/HeadBucketRequest.h>
#include <aws/s3/model/GetBucketLocationRequest.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/DeleteObjectRequest.h>
#include <aws/s3/model/HeadObjectRequest.h>
#include <aws/s3/model/ListObjectsRequest.h>
//  g++ -o s3test s3test.cpp -std=c++11 -laws-cpp-sdk-core -laws-cpp-sdk-s3
//  export LD_LIBRARY_PATH=/usr/local/lib64
//  ./s3test
//两个KEY从安装的服务器 /root/.s3cfg 获取
#define AKEY    "5WsAtWJEkopkO9Oo"
#define SKEY    "kchfTxgS30LfMUbLiZwKzAOLP2Xv2jov"
#define URL     "192.168.2.120:80"
using namespace Aws::S3;
using namespace Aws::S3::Model;
using namespace std;
//列出桶:
int list_buckets(S3Client &s3_client) {
	auto response = s3_client.ListBuckets();
	if (response.IsSuccess()) {
		auto buckets = response.GetResult().GetBuckets();
		for (auto iter = buckets.begin(); iter != buckets.end(); ++iter) {
			cout << iter->GetName() << "\t" << iter->GetCreationDate().ToLocalTimeString(Aws::Utils::DateFormat::ISO_8601) << endl;
		}
	} else {
		cout << "Error while ListBuckets " << response.GetError().GetExceptionName()
			<< " " << response.GetError().GetMessage() << endl;
	}
	return 0;
}
//创建桶:
int create_bucket(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	Aws::S3::Model::CreateBucketRequest request;
	request.WithBucket(bucket_name);
	Aws::S3::Model::CreateBucketConfiguration bucket_config;
	request.SetCreateBucketConfiguration(bucket_config);
	auto response = s3_client.CreateBucket(request);
	if (response.IsSuccess()) {
		std::cout << "Done!" << std::endl;
	}else{
		auto err = response.GetError();
		std::cout << "ERROR: CreateBucket: " << 
			err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
	}
	return 0;
}
//删除桶:
int delete_bucket(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	Aws::S3::Model::DeleteBucketRequest request;
	request.WithBucket(bucket_name);
	auto response = s3_client.DeleteBucket(request);
	if (response.IsSuccess()) {
		std::cout << "Done!" << std::endl;
	}else{
		auto err = response.GetError();
		std::cout << "ERROR: DeleteBucket: " << 
			err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
	}
	return 0;
}
//列出对象:
int list_objects(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	Aws::S3::Model::ListObjectsRequest list_objects_request;
	list_objects_request.WithBucket(bucket_name);
	auto list_objects_outcome = s3_client.ListObjects(list_objects_request);        
	if (list_objects_outcome.IsSuccess())  {
		Aws::Vector<Aws::S3::Model::Object> object_list =
			list_objects_outcome.GetResult().GetContents();

		for (auto const &s3_object: object_list) {
			std::cout << "* " << s3_object.GetKey() << std::endl;
		}
	} 
	else{
		std::cout << "ListObjects error: " <<
			list_objects_outcome.GetError().GetExceptionName() << " " <<
			list_objects_outcome.GetError().GetMessage() << std::endl;
	}
	return 0;
}
//上传对象:
int put_object(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	const Aws::String object_name = "UDBTO.png";
	const Aws::String file_name = "UDBTO.png";
	Aws::S3::Model::PutObjectRequest put_object_request;
	put_object_request.WithBucket(bucket_name).WithKey(object_name);
	auto input_data = Aws::MakeShared<Aws::FStream>("PutObjectInputStream",file_name.c_str(), std::ios_base::in);
	put_object_request.SetBody(input_data);
	auto put_object_outcome = s3_client.PutObject(put_object_request);
	if (put_object_outcome.IsSuccess()) {
		std::cout << "Done!" << std::endl;
	} else {
		std::cout << "GetObject error: " <<
			put_object_outcome.GetError().GetExceptionName() << " " <<
			put_object_outcome.GetError().GetMessage() << std::endl;
	}
	return 0;
}
//下载对象:
int get_object(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	const Aws::String object_name = "UDBTO.png";
	const Aws::String file_name = "UDBTO.png";
	Aws::S3::Model::GetObjectRequest get_object_request;
	get_object_request.WithBucket(bucket_name).WithKey(object_name);
	auto get_object_outcome = s3_client.GetObject(get_object_request);
	if (get_object_outcome.IsSuccess()) {
		Aws::OFStream local_file;
		local_file.open(file_name.c_str(), std::ios::out | std::ios::binary);
		local_file << get_object_outcome.GetResult().GetBody().rdbuf();
		local_file.close();
		std::cout << "Done!" << std::endl;
	} else {
		std::cout << "GetObject error: " <<
			get_object_outcome.GetError().GetExceptionName() << " " <<
			get_object_outcome.GetError().GetMessage() << std::endl;
	}
	return 0;
}
//删除对象:
int delete_object(S3Client &s3_client) {
	const Aws::String bucket_name = "udbtovol";
	const Aws::String object_name = "UDBTO.png";
	Aws::S3::Model::DeleteObjectRequest del_object_request;
	del_object_request.WithBucket(bucket_name).WithKey(object_name);
	auto delete_object_outcome = s3_client.DeleteObject(del_object_request);
	if (delete_object_outcome.IsSuccess()) {
		std::cout << "Done!" << std::endl;
	} else {
		std::cout << "DeleteObject error: " <<
			delete_object_outcome.GetError().GetExceptionName() << " " <<
			delete_object_outcome.GetError().GetMessage() << std::endl;
	}
	return 0;
}
int main(int argc, char* argv[]) {
	Aws::SDKOptions options;
	options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace;
	Aws::InitAPI(options);
	Aws::Client::ClientConfiguration cfg;
	cfg.endpointOverride = URL;  // S3服务器地址和端口
	cfg.scheme = Aws::Http::Scheme::HTTP;
	cfg.verifySSL = false;
	Aws::Auth::AWSCredentials cred(AKEY, SKEY);  // 认证的Key
	S3Client s3_client(cred, cfg, false, false);
	list_buckets(s3_client);
	//create_bucket(s3_client);
	//delete_bucket(s3_client);
	//list_objects(s3_client);
	//put_object(s3_client);
	//get_object(s3_client);
	//delete_object(s3_client);
	Aws::ShutdownAPI(options);
	return 0;
}