rust axum multipart upload example

use std::{fs, io::Write};

use axum::{extract::Multipart, response::IntoResponse, routing::post, Router};
use futures::{StreamExt, TryStreamExt};
use serde::{Deserialize, Serialize};
use uuid::Uuid;



#[derive(Debug, Serialize, Deserialize, Clone)]
struct FileResp {
    #[serde(rename = "dataURL")]
    data_url: String,
    filename: String,
}

async fn upload(mut multipart: Multipart) -> impl IntoResponse {
    let mut file_list = Vec::new();
    while let Some(field) = multipart.next_field().await.unwrap() {
        let data_url = format!("upload/{}", Uuid::new_v4());
        let mut file = fs::File::create(&data_url).unwrap();
        let filename = field.name().unwrap().to_string();
        let mut stream = field.into_stream();
        while let Some(chunk) = stream.next().await {
            let data = chunk.unwrap();
            file.write_all(&data).unwrap();
        }
        file_list.push(FileResp { data_url, filename })
    }
    RespInfo::from(&file_list).to_json()
}

axum = { version = "0.6.1", features = ["headers", "multipart"] }

 

RustAxum是一个快速、安全且高度可定制的Web框架,它构建于Tokio异步运行时之上,适合高性能网络服务的开发。当涉及到大文件上传时,Axum提供了一种处理HTTP请求流的方式,特别是对于`multipart/form-data`类型的POST请求,这种请求通常用于上传文件。 在Axum中处理大文件上传,你可以遵循以下步骤: 1. **设置中间件**:首先,你需要一个支持文件上传的中间件,如`axum-middlewares::file_upload`。这个中间件会解析上传的数据并将其存储到内存暂存区或临时目录。 ```rust use axum::{web, Upload}; use axum_middlewares::file_upload::{FileUploadError, FileUploadMiddleware}; async fn handle_file_upload( mut request: web::Payload, ) -> Result<impl web::Result, FileUploadError> { // ... 实现文件处理逻辑 } ``` 2. **配置接收限制**:为了防止服务器崩溃,需要设置合理的接收大小限制,可以使用`ChunkedBody`来读取上传数据分块。 ```rust let body = request.multipart_body().await?; ``` 3. **处理文件流**:通过`body.into_parts()`获取上传文件的部分,并将它们写入磁盘或其他持久化存储。 4. **验证和清理**:确保文件名合法性、检查大小等,然后删除内存中的暂存数据。 5. **返回响应**:如果上传成功,返回一个确认的响应;如果有错误,则返回适当的HTTP状态码和错误信息。 ```rust match process_file(&mut body) { Ok(file_path) => { // 返回成功上传的信息 Ok(web::Json::from_value(file_path.to_string())) }, Err(error) => { // 返回错误信息 Err(error.into()) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devopen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值