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(())
}