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

  1. 对象命名规则请参见 API 手册 对象
  2. 更多的上传文件信息,请参见 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

  1. 上面的代码默认列举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;
    }
}