域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。
  • 方案1️⃣AXUM.RS 域名 = 3000
  • 方案2️⃣方案1️⃣ + 本站所有专题原始 Markdown 文档 = 5000
  • 方案3️⃣方案2️⃣ + 本站原始数据库 = 5500
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名(方案1️⃣),或者该域名到期,本站将启用新的免费域名继续提供服务。
  2. 如果有人购买了 AXUM.RS 域名,且同时购买了内容和/或数据库(方案2️⃣/方案3️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

Rust 集成 B2

本章将讨论如何将 B2 集成到 Rust中。

由于 B2 兼容 S3,所以完全可以使用 S3 相关的 crate,本专题将使用rust-s3

[dependencies]
rust-s3 = "0.33"
tokio = { version = "1", features = ["full"]}
  • rust-s3 即是我们需要的依赖项
  • 由于我们使用的是 tokio 异步库,所以加上其依赖

接下来,我们看一下它的基本操作。

授权

首先,你需要按照《使用 B2 存储》章节所述,注册并添加应用程序密钥。

rust-s3 的授权封装在 s3::creds::Credentials结构体中,对于 B2 而言,该结构体的以下两个字段必须填写:

  • access_key:对应B2应用程序的 keyID
  • secret_key:对应B2应用程序的 applicationKey

所以,它最终是这样的:

实例化桶

授权是实例化桶时的参数之一,它需要以下参数:

  • 桶名:你创建的应用程序密钥对应的桶名称
  • 区域:该桶的 Endpoint
  • 授权:上一步骤创建的授权
let bucket = s3::Bucket::new("桶名称", "区域".parse().unwrap, cred).unwrap();

实例化桶之后,就可以进行一系列操作了。

  • put_object(远程路径, 数据)
  • put_object_with_content_type(远程路径, 数据, 内容类型)

两者区别在于,无论什么类型的文件,put_object() 的*content type(内容类型)*均为 application/octet-stream,而 put_object_with_content_type() 可以手动为不同的文件指定对应的内容类型。

let path = "axum.rs.file";
let data = "axum中文网:axum.rs".as_bytes();

let resp = bucket.put_object(path, data).await.unwrap();
assert_eq!(resp.status_code(), 200);
println!("{:?}", resp);

let resp = bucket.put_object_with_content_type(path, data, "plain/text").await.unwrap();
assert_eq!(resp.status_code(), 200);
println!("{:?}", resp);

下载文件

通过 get_object_to_writer() 可以下载文件并写入到指定目标。

let mut output_file = tokio::fs::File::create("/tmp/axum.rs.file").await.expect("创建文件失败");

let status_code = bucket.get_object_to_writer("axum.rs.file", &mut output_file).await?

删除文件

使用 delete_object() 可以删除指定的文件。

要查看完整内容,请先登录