域名 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️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

axum 上传文件

文件上传是 Web 开发中常见的功能,本章将演示如何在 axum 实现文件上传。

启用 feature

要让 axum 支持文件上传,需要在 Cargo.toml 中显式的启用名为multipart的 feature:

axum =  {version = "0.3", features = ["multipart"] }

文件上传表单

注意,要使用文件上传,必须将<form>enctype设置为multipart/form-data

注意,要使用文件上传,必须将<form>enctype设置为multipart/form-data

处理上传

/// 上传操作
async fn upload_file_action(
    ContentLengthLimit(mut multipart): ContentLengthLimit<Multipart, { MAX_UPLOAD_SIZE }>,
) -> Result<(HeaderMap, String), String> {
    if let Some(file) = multipart.next_field().await.unwrap() {
        let filename = file.file_name().unwrap().to_string(); // 上传的文件名
        let data = file.bytes().await.unwrap(); // 上传的文件的内容

        // 保存上传的文件
        //std::fs::write(&filename, &data).map_err(|err| err.to_string())?;
        tokio::fs::write(&filename, &data)
            .await
            .map_err(|err| err.to_string())?;

        return cn(format!(
            "【上传的文件】文件名:{:?}, 文件大小:{}",
            filename,
            data.len()
        ))
        .await;
    }
    cn(String::from("没有上传文件")).await
}

注意这个函数的参数:ContentLengthLimit(mut multipart): ContentLengthLimit<Multipart, { MAX_UPLOAD_SIZE }>

  • ContentLengthLimitMultipart 都是 axum 提供的extract。前者用于限制 HTTP 内容的长度,后者用于处理multipart/form-data

  • 获取到的变量是mut

ContentLengthLimitMultipart 都是 axum 提供的extract。前者用于限制 HTTP 内容的长度,后者用于处理multipart/form-data

然后,我们通过相关方法获取到上传文件的信息:

  • file_name():获取上传的文件的文件名

  • bytes():获取上传的文件的内容

  • name():获取<input type="file" name="axum_rs_file">标签的name属于,此例中为axum_rs_file

bytes():获取上传的文件的内容

name():获取<input type="file" name="axum_rs_file">标签的name属于,此例中为axum_rs_file

最后,将上传的文件保存到服务器上:

tokio::fs::write(&filename, &data)
            .await
            .map_err(|err| err.to_string())?;

我们使用了tokio提供的异步 API,将上传的内容保存到服务器。

本章讨论了在 axum 实现文件上传功能,完整代码可以在我们的代码库中找到。

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