rust-阿里云oss连接

阿里云没有官方的oss-rust连接库。

axum = "0.6" # HTTP 服务框架
tokio = { version = "1", features = ["full"] } # 异步运行时
rust-s3 = "0.34" # S3 和 OSS SDK
serde = { version = "1.0", features = ["derive"] } # 数据序列化和反序列化
serde_json = "1.0" # JSON 处理
tracing = "0.1" # 日志记录
tracing-subscriber = "0.3" # 日志订阅器

使用rust-s3 来连接oss。

use dotenvy::dotenv;
use s3::bucket::Bucket;
use s3::creds::Credentials;
use s3::Region;
use std::env;
use std::error::Error;

/// 从一个目录迁移文件到另一个目录
pub async fn migrate_files(
source_dir: &str,
destination_dir: &str,
) -> Result<(), Box> {
// 加载 .env 文件
dotenv().ok();

// 从环境变量读取 OSS 配置
let access_key_id = env::var("OSS_ACCESS_KEY_ID")?;
let access_key_secret = env::var("OSS_ACCESS_KEY_SECRET")?;
let region_name = env::var("OSS_REGION")?;
let endpoint = env::var("OSS_ENDPOINT")?;
let bucket_name = env::var("OSS_BUCKET_NAME")?;

// 配置 OSS 存储桶
let region = Region::Custom {
    region: region_name,
    endpoint,
};
let credentials = Credentials::new(
    Some(&access_key_id),
    Some(&access_key_secret),
    None,
    None,
    None,
)?;
let bucket = Bucket::new(&bucket_name, region, credentials)?;

// 列出源目录中的文件
let source_objects = bucket
    .list(source_dir.to_string(), None)
    .await?
    .into_iter()
    .flat_map(|result| result.contents)
    .collect::<Vec<_>>();

// 打印找到的文件
for object in &source_objects {
    println!("Found file: {}", object.key);
}

// 遍历源目录中的文件并迁移到目标目录
for object in source_objects {
    let source_key = &object.key;
    let destination_key = format!("{}/{}", destination_dir, source_key.trim_start_matches(source_dir));

    // 获取文件内容
    let file_data = bucket.get_object(source_key).await?.bytes();

    // 将文件上传到目标目录
    bucket.put_object(destination_key, file_data).await?;
    println!("Migrated: {} -> {}", source_key, destination_key);
}

Ok(())

}