在 Rust 中使用 S3 和云存储:aws-sdk-s3 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Rust 中使用 S3 和云存储:aws-sdk-s3 库



云对象存储(例如 Amazon S3)已成为存储和分发文件、备份及媒体内容的标准。Rust 作为一种系统编程语言,提供了强大且安全的工具来集成这些服务。主要的库是 aws-sdk-s3——Amazon 为 Rust 提供的官方 SDK。



在本文中,我们将介绍如何配置项目、执行基本操作(上传、下载、删除)以及如何与兼容 S3 的存储(例如 MinIO 或 Yandex Object Storage)配合使用。



安装与配置



在 Cargo.toml 中添加:



[dependencies]aws-sdk-s3 = "1.0"aws-config = "1.0"tokio = { version = "1", features = ["full"] }


身份验证使用环境变量或 ~/.aws/credentials 文件:



export AWS_ACCESS_KEY_ID="your_access_key"export AWS_SECRET_ACCESS_KEY="your_secret_key"export AWS_DEFAULT_REGION="us-east-1"


初始化客户端



创建一个异步 S3 客户端:



use aws_sdk_s3::Client;use aws_config::load_defaults;use aws_config::BehaviorVersion;

#[tokio::main]async fn main() { let config = load_defaults(BehaviorVersion::latest()).await; let client = Client::new(&config); // 现在 client 已准备好使用}


上传文件到 S3(Upload)



使用 put_object 方法上传数据。数据可以作为字节或流传递:



use aws_sdk_s3::primitives::ByteStream;use std::path::Path;

async fn upload_file(client: &Client, bucket: &str, key: &str, file_path: &str) -> Result<(), Box<dyn std::error::Error>> { let body = ByteStream::from_path(Path::new(file_path)).await?; client .put_object() .bucket(bucket) .key(key) .body(body) .send() .await?; println!("文件 {} 已上传到 {}/{}", file_path, bucket, key); Ok(())}


下载文件(Get Object)



获取对象并保存到本地:



use tokio::io::AsyncWriteExt;

async fn download_file(client: &Client, bucket: &str, key: &str, dest_path: &str) -> Result<(), Box<dyn std::error::Error>> { let response = client .get_object() .bucket(bucket) .key(key) .send() .await?; let mut file = tokio::fs::File::create(dest_path).await?; let mut stream = response.body; while let Some(bytes) = stream.try_next().await? { file.write_all(&bytes).await?; } println!("文件 {}/{} 已下载到 {}", bucket, key, dest_path); Ok(())}


列出存储桶中的对象



获取存储桶中的文件(键)列表:



async fn list_objects(client: &Client, bucket: &str) -> Result<(), Box<dyn std::error::Error>> {    let objects = client        .list_objects_v2()        .bucket(bucket)        .send()        .await?;        if let Some(contents) = objects.contents {        for obj in contents {            if let Some(key) = obj.key {                println!("- {}", key);            }        }    }    Ok(())}


删除对象



async fn delete_object(client: &Client, bucket: &str, key: &str) -> Result<(), Box<dyn std::error::Error>> {    client        .delete_object()        .bucket(bucket)        .key(key)        .send()        .await?;        println!("对象 {}/{} 已删除", bucket, key);    Ok(())}


使用 MinIO 和其他兼容 S3 的存储



要连接到 MinIO(本地 S3 模拟器)或 Yandex Object Storage,需要覆盖端点

推荐