3. 快速入门¶
使用S3 CPP SDK前,您可以先参照 API 手册 熟悉NOS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本节您将看到如何快速的使用S3 CPP SDK,完成常用的操作,上传文件、下载文件等。
3.1. 常用类¶
常用类 | 备注 |
---|---|
S3Client | S3客户端类,用户通过S3Client调用服务 |
3.2. 基本操作¶
3.2.1. 上传文件¶
对象(Object)是NOS中最基本的数据单元,您可以把它简单的理解为文件,以下代码可以实现简单的对象上传:
void putObjectFromContent(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName,const std::shared_ptr<Aws::FStream>& input_data){
Aws::S3::Model::PutObjectRequest object_request;
object_request.WithBucket(bucketName).WithKey(objectName);
auto input_data = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream",content);
object_request.SetBody(input_data);
auto put_object_outcome = s3Client.PutObject(object_request);
if (put_object_outcome.IsSuccess())
{
std::cout << "Done!" << std::endl;
}
else
{
std::cout << "PutObject error: " <<
put_object_outcome.GetError().GetExceptionName() << " " <<
put_object_outcome.GetError().GetMessage() << std::endl;
}
}
//如果是指定文件名的上传方式,那么input_data通过这种方式构建,第一个参数只是个flag,随便传即可
auto input = Aws::MakeShared<Aws::FStream>("test",file_name.c_str(), std::ios_base::in | std::ios_base::binary);
Attention
- 对象命名规则请参见 API 手册 对象
- 更多的上传文件信息,请参见 S3-CPP-SDK 上传文件
3.2.2. 下载文件¶
上传对象成功之后,您可以读取它的内容,以下代码可以实现文件的下载:
void downloadObject(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName,const Aws::String& saveName){
Aws::S3::Model::GetObjectRequest object_request;
object_request.WithBucket(bucketName).WithKey(objectName);
auto get_object_outcome = s3Client.GetObject(object_request);
if (get_object_outcome.IsSuccess())
{
Aws::OFStream local_file;
local_file.open(saveName.c_str(), std::ios::out | std::ios::binary);
local_file << get_object_outcome.GetResult().GetBody().rdbuf();
std::cout << "Done!" << std::endl;
}
else
{
std::cout << "GetObject error: " <<
get_object_outcome.GetError().GetExceptionName() << " " <<
get_object_outcome.GetError().GetMessage() << std::endl;
}
}
更多的下载文件信息,请参见 S3 CPP SDK 下载文件
3.2.3. 列举文件¶
当上传文件成功之后,可以查看桶中包含的文件列表,以下代码展示如何列举桶内的文件:
void listObjectsWithPrintKeySize(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName){
Aws::S3::Model::ListObjectsRequest listObjectRequest;
listObjectRequest.WithBucket(bucketName);
auto result = s3Client.ListObjects(listObjectRequest);
if (result.IsSuccess()) {
for(auto content : result.GetResult().GetContents()){
std::cout << content.GetKey() << " --> " << content.GetSize() << std::endl;
}
} else {
std::cout << "list Objects failed" << std::endl;
}
}
Note
- 上面的代码默认列举100个object
更多的管理文件信息,请参见 S3 CPP SDK 文件管理
3.2.4. 删除文件¶
文件上传成功后,可以指定删除桶中的文件,以下代码实现桶中文件的删除:
void deleteObject(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){
Aws::S3::Model::DeleteObjectRequest object_request;
object_request.WithBucket(bucketName).WithKey(objectName);
auto delete_object_outcome = s3Client.DeleteObject(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;
}
}
3.2.5. 返回结果处理¶
S3 提供的所有接口都是有返回值的,且可以通过IsSuccess()方法查看操作是否执行成功
例如:
void deleteObject(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){
Aws::S3::Model::DeleteObjectRequest object_request;
object_request.WithBucket(bucketName).WithKey(objectName);
auto delete_object_outcome = s3Client.DeleteObject(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;
}
}