aliyun-oss-client

aliyun OSS 的一个客户端

最开始的时候,是作为一个 rust 练手项目,渐渐的现在越来越完善了,包含了 rust 的 struct,enum, async, trait features 等特性, 以及自定义 error 类,同时也包含完整的的测试用例

使用方法

  1. 在自己的项目里添加如下依赖项 (项目遵循语义化版本规则,请放心使用)

[dependencies] aliyun-oss-client = "^0.7"

  1. 打开你需要使用 oss 的文件,在里面添加如下内容,即可使用:

``` // dotenv 是用于获取配置信息的,可以不使用 extern crate dotenv; use dotenv::dotenv; use std::env;

// 需要提供四个配置信息 let keyid = env::var("ALIYUNKEYID").unwrap(); let keysecret = env::var("ALIYUNKEYSECRET").unwrap(); let endpoint = env::var("ALIYUNENDPOINT").unwrap(); let bucket = env::var("ALIYUNBUCKET").unwrap();

// 获取客户端实例 let client = aliyunossclient::client(&keyid,&keysecret, &endpoint, &bucket); ```

异步

查询所有的 bucket 信息

let response = client.get_bucket_list().await.unwrap(); println!("buckets list: {:?}", response);

获取 bucket 信息

let response = client.get_bucket_info().await.unwrap(); println!("bucket info: {:?}", response);

查询当前 bucket 中的 object 列表

let query: HashMap<String,String> = HashMap::new(); let response = client.get_object_list(query).await.unwrap(); println!("objects list: {:?}", response);

也可以使用 bucket struct 查询 object 列表

``` let mut query:HashMap = HashMap::new(); query.insert("max-keys".tostring(), "5".tostring()); query.insert("prefix".tostring(), "babel".tostring());

let result = client.getbucketinfo().await.unwrap().getobjectlist(query).await.unwrap();

println!("object list : {:?}", result);

```

上传文件

``` client.put_file("examples/bg2015071010.png", "examples/bg2015071010.png").expect("上传失败");

// or 上传文件内容 let mut filecontent = Vec::new(); std::fs::File::open(filename) .expect("open file failed").readtoend(&mut filecontent) .expect("readtoend failed"); client.putcontent(&file_content, "examples/bg2015071010.png").await.expect("上传失败"); ```

由于 aliyun 在上传文件时需要提供 Content-Type,本 lib 提供了一个基础的判断功能,对于不常用的文件类型,可参考 plugin 部分的文档,进行扩展

删除文件

client.delete_object("examples/bg2015071010.png").await.unwrap();

同步(阻塞模式)

如需使用,需要启用 blocking 特征

查询所有的 bucket 信息

let response = client.blocking_get_bucket_list().unwrap(); println!("buckets list: {:?}", response);

获取 bucket 信息

let response = client.blocking_get_bucket_info().unwrap(); println!("bucket info: {:?}", response);

查询当前 bucket 中的 object 列表

let query: HashMap<String,String> = HashMap::new(); let response = client.blocking_get_object_list(query).unwrap(); println!("objects list: {:?}", response);

也可以使用 bucket struct 查询 object 列表

``` let mut query:HashMap = HashMap::new(); query.insert("max-keys".tostring(), "5".tostring()); query.insert("prefix".tostring(), "babel".tostring());

let result = client.blockinggetbucketinfo().unwrap().blockinggetobjectlist(query).unwrap();

println!("object list : {:?}", result);

// 翻页功能 获取下一页数据 println!("next object list: {:?}", result.next().unwrap()); ```

上传文件

``` client.blockingputfile("examples/bg2015071010.png", "examples/bg2015071010.png").expect("上传失败");

// or 上传文件内容 let mut filecontent = Vec::new(); std::fs::File::open(filename) .expect("open file failed").readtoend(&mut filecontent) .expect("readtoend failed"); client.blockingputcontent(&filecontent, "examples/bg2015071010.png").expect("上传失败"); ```

由于 aliyun 在上传文件时需要提供 Content-Type,本 lib 提供了一个基础的判断功能,对于不常用的文件类型,可参考 plugin 部分的文档,进行扩展

删除文件

client.blocking_delete_object("examples/bg2015071010.png").unwrap();

Plugin

插件机制,可以在保持项目本身不变动的情况下,提供更多功能

扩展文件类型

举个例子 Tauri 打包的升级包的签名文件,不在常用的文件类型中,可以使用如下的扩展,进行使用

``` use aliyunossclient::plugin::Plugin;

// 创建一个扩展 struct struct SigFile;

// 实现 Plugin trait 中的方法, impl Plugin for SigFile { fn name(&self) -> &'static str { "sigfileext" }

// 这是扩展的初始化方法,在插件挂载时会运行
// 具体实现,请参考 https://docs.rs/infer/0.9.0 文档
fn initialize(&mut self, client: &mut Client) -> OssResult<()> {
    let mime_type = "application/pgp-signature";
    let extension = "sig";
    fn m(buf: &[u8]) -> bool {
        return buf.len() >= 3 && buf[0] == 0x64 && buf[1] == 0x57 && buf[2] == 0x35;
    }
    client.infer.add(mime_type, extension, m);

    Ok(())
}

}

// 在 lib 初始化时挂载该插件, let clienthasplugin = aliyunossclient::client("abc", "abc", "abc", "abc") .plugin(Box::new(SigFile{})).unwrap(); ```

官方 client 对比