#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;
}