域名 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 实现文件上传。

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

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

文件上传表单

首先,我们定义文件上传表单:

/// 上传表单
async fn upload_file() -> Html<&'static str> {
    Html(
        r#"
        <!doctype html>
        <html>
            <head>
            <meta charset="utf-8">
                <title>上传文件</title>
            </head>
            <body>
                <form action="/upload" method="post" enctype="multipart/form-data">
                    <label>
                        上传文件:
                        <input type="file" name="axum_rs_file">
                    </label>
                    <button type="submit">上传文件</button>
                </form>
            </body>
        </html>
        "#,
    )
}

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

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

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

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

获取到的变量是mut

首先,我们通过multipart.next_field()获取到提交过来的(下一个)type="file"的表单域。由它的方法名可知,它支持多文件上传。

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

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

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

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

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

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())?;

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

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