巨大更新,之前使用过的,慎重升级 0.13
详细使用案例如下:
- 基本操作
use aliyun_oss_client::{Client, Bucket};
use futures_util::StreamExt;
async fn run() -> Result<(), aliyun_oss_client::Error> {
let client = Client::from_env()?;
// or let client = Client::new("key_xxx", "secret_yyy", "endpoint_url")?;
// 获取 buckets 列表
let buckets = client.get_buckets().await?;
// 用流的方式获取文件列表
// 接口每次请求只读取5个文件,随着 next() 函数的不断调用,每隔五个会重新调用一次接口,获取下一页的文件
let mut stream = Client::from_env()?
.bucket("honglei123")?
.max_keys(5)
.objects();
let mut i = 0;
while let Some(item) = stream.next().await {
println!("{item:?}");
i = i + 1;
if i > 7 {
// 不加限制的话,会获取所有文件
break;
}
}
// 完整的查询条件示例
let mut stream = Client::from_env()?
.bucket("honglei123")?
.max_keys(5)
.prefix("prefix1/")
.delimiter("/")
.continuation_token("foo")
.encoding_type("foo2")
.start_after("foo3")
.fetch_owner(true)
.objects();
// 查询 Object 并转化成自定义类型
#[derive(Debug, Deserialize)]
struct MyObject {
Key: String,
}
let mut stream = Client::from_env()?
.bucket("honglei123")?
.max_keys(5)
.objects_as::<MyObject>();
// 获取文件的详细信息
let obj_info = Bucket::from_env()?
.object("abc.txt")
.get_info()
.await?;
// 上传文件
let res = Bucket::from_env()?
.object("abc2.txt")
.content_type("text/plain;charset=utf-8")
.upload("aaab")
.await?;
// 使用文件句柄上传文件
let mut f = tokio::fs::File::open("example_file.txt").await?;
let info = Bucket::from_env()?
.object("abc_file.txt")
.content_type("text/plain;charset=utf-8")
.upload(f)
.await?;
// 使用目录上传文件
let res = Bucket::from_env()?
.object("abc2.txt")
.content_type("text/plain;charset=utf-8")
.upload_file("local.txt")
.await?;
// 下载文件到文件句柄
// 使用流式下载,支持边下载边解压/压缩
let mut file = tokio::fs::File::create("aaa.txt").await?;
let res = Bucket::from_env()?
.object("download1.jpg")
.download(&mut file)
.await?;
//下载文件到指定文件路径
let res = Bucket::from_env()?
.object("download1.jpg")
.download_to_file("local.jpg")
.await?;
//获取下载文件的 Vec<u8> 内容
let content = Bucket::from_env()?
.object("download1.jpg")
.download_to_bytes()
.await?;
//获取下载文件的 String 内容
let content = Bucket::from_env()?
.object("download1.jpg")
.download_to_string()
.await?;
// 复制文件
let res = Bucket::from_env()?
.object("new_file.txt")
.copy_source("/bucket_name/source_file.txt")
.content_type("text/plain;charset=utf-8")
.copy()
.await?;
// 分片上传(大文件)
let result = Bucket::from_env()?
.object("myvideo23.mov")
.multipart()
//.part_size(3 * 1024 * 1024) // 调整分片大小,默认 1M
.from_file("./video.mov")
.upload()
.await?;
// 删除文件
let result = Bucket::from_env()?
.object("abc.txt")
.delete()
.await?;
Ok(())
}- 导出 bucket 到自定义类型
#[derive(Debug, Deserialize)]
struct MyBucket {
Comment: String,
CreationDate: String,
ExtranetEndpoint: EndPoint,
IntranetEndpoint: String,
Location: String,
Name: String,
Region: String,
StorageClass: String,
}
let list: Vec<MyBucket> = client.export_buckets().await?;- 导出 bucket 详细信息到自定义类型
#[derive(Debug, Deserialize)]
struct MyBucketInfo {
Name: String,
}
let res: MyBucketInfo = Bucket::from_env()?
.export_info()
.await?;