跳到主要内容

az-rustfs

自动收集自 crates/storage/az-rustfs/README.md

S3 兼容对象存储客户端抽象。封装 rust-s3,提供同步/异步上传、下载、分片上传、进度追踪等功能,同时内置纯内存实现用于测试。

功能

  • S3StorageClient trait:统一的存储客户端接口(bucket 管理、对象 CRUD、预签名 URL)
  • Rustfs facade:统一入口,支持默认配置、显式配置和注入式工厂构造
  • BlockingS3StorageClient:基于 rust-s3 的同步 S3 实现
  • InMemoryS3StorageClient:纯内存的测试用实现
  • S3StorageClientFactory:可注入的客户端工厂模式
  • 智能上传:自动判断是否使用分片上传(should_use_multipart_upload),自动计算最优分片大小
  • 分片上传进度追踪:UploadProgressListener trait + SpeedTrackingProgressListener 实现
  • 断点续传支持:resume_or_upload 自动跳过已完成分片
  • 预签名 URL 生成:get_presigned_object_url
  • 工具函数:guess_content_typebuild_list_requestensure_bucketput_object_bytesput_object_file

安装

Cargo.toml 中添加:

[dependencies]
az-rustfs = { path = "../az-rustfs" } # workspace 内部引用
# 或发布后:
# az-rustfs = "0.1" # crates.io 引用

用法

use az_rustfs::{
get_object, ensure_bucket, put_object_bytes, Rustfs,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Rustfs::default_client();
let bucket = "my-bucket";

ensure_bucket(&*client, bucket)?;
put_object_bytes(&*client, bucket, "hello.txt", b"Hello, rustfs!", Some("text/plain"))?;

let data = get_object(&*client, bucket, "hello.txt")?;
assert_eq!(data, b"Hello, rustfs!");

Ok(())
}

工厂注入

use az_rustfs::{DefaultS3StorageClientFactory, Rustfs, RustfsConfig};

let factory = DefaultS3StorageClientFactory::default();
let client = Rustfs::storage_client_with_factory(&factory, RustfsConfig::default());
assert_eq!(std::sync::Arc::strong_count(&client), 1);

依赖的 crates

  • base64 — Base64 编解码
  • chrono — 时间戳处理
  • hmac / sha2 / md5 — 签名与哈希
  • quick-xml — S3 XML 响应解析
  • reqwest — HTTP 客户端(S3 API 调用)
  • mime_guess — 根据扩展名推断 Content-Type
  • thiserror — 错误类型派生