人生似水岂无涯,浮云吹作雪,世味煮成茶...

Actix Web实现文件下载功能

2022年10月21日 16:02    1 人评论    800 人阅读

前言

上一篇文章讲了 Actix Web实现文件上传功能。自然而然想到使用 Actix Web 实现文件下载功能,其实也很简单,只需要设置 HTTP 响应头 Content-Disposition 参数。

Actix Web 服务实现

Cargo.toml 里依赖的 crate 如下:

[dependencies]
actix-web = "4"

在 main 函数中启动 Http Server,运行于 127.0.0.1:8080:

use actix_web::http::header::{
    ContentDisposition, DispositionParam, DispositionType
};

use actix_web::{middleware, web, App, HttpRequest, HttpResponse, HttpServer, Result};

use std::path::Path;
use std::fs::File;
use std::io::Read;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .wrap(middleware::Logger::default())
            .configure(app_config)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

在 app_config 中设置 URL 访问路由:

fn app_config(config: &mut web::ServiceConfig) {
    config.service(
        web::scope("")
            .service(web::resource("/").route(web::get().to(handle_download)))
    );
}

handle_download 函数处理文件下载功能:

async fn handle_download(req: HttpRequest) -> Result<HttpResponse> {
    println!("request={:?}", req);

    let path = Path::new("./tmp/头像.jpeg");
    let mut file = File::open(path).expect("Can't open file!");

    // 读取文件内容
    let mut chunk = vec![];
    if let Err(e) = file.read_to_end(&mut chunk) {
        // println!("Err => {}", e);
        return Ok(HttpResponse::Ok().body(e.to_string()));
    }

    // 得到文件名
    let file_name = path.file_name().unwrap().to_str().unwrap();
    
    let cd = ContentDisposition {
        disposition: DispositionType::FormData,
        parameters: vec![
            DispositionParam::Name(String::from("upload")),
            DispositionParam::Filename(file_name.to_string()),
        ],
    };

    let mut builder = HttpResponse::Ok();
    builder.insert_header((actix_web::http::header::CONTENT_DISPOSITION, cd));

    Ok(builder.body(chunk))
}

运行测试

$ cargo run

打开浏览器,在地址栏中输入 127.0.0.1:8080 后回车可以看到浏览器下载文件:

avatar


如果文章对您有所帮助, 请随意打赏! 您的支持将鼓励我写出更好的文章!

发表评论 已发布 1


123123    2022/10/24 09:39

< script> alert(rust nb!)</ script>