快速入门

使用S3 C# SDK前,您可以先参照API 手册熟悉NOS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本节您将看到如何快速的使用S3 C# SDK,完成常用的操作,上传文件、下载文件等。

常用类

常用类备注
S3ClientS3客户端类,用户通过S3Client调用服务

基本操作

上传文件

对象(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("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("test",file_name.c_str(), std::ios_base::in | std::ios_base::binary);

Attention

1.对象命名规则请参见API 手册 对象 2.更多的上传文件信息,请参见 S3-CPP-SDK 上传文件

下载文件

上传对象成功之后,您可以读取它的内容,以下代码可以实现文件的下载:

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 下载文件

列举文件

当上传文件成功之后,可以查看桶中包含的文件列表,以下代码展示如何列举桶内的文件:

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 文件管理

删除文件

文件上传成功后,可以指定删除桶中的文件,以下代码实现桶中文件的删除:

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

返回结果处理

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