Skip to content

tu6ge/oss-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

872 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

aliyun_oss_client 打算采用一种全新的方式来实现

巨大更新,之前使用过的,慎重升级 0.13

详细使用案例如下:

  1. 基本操作
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(())
}
  1. 导出 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?;
  1. 导出 bucket 详细信息到自定义类型
#[derive(Debug, Deserialize)]
struct MyBucketInfo {
    Name: String,
}
let res: MyBucketInfo = Bucket::from_env()?
    .export_info()
    .await?;

About

一个阿里云 OSS 的 rust SDK

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors 2

  •  
  •  

Languages