首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Axum中将内容作为文件下载返回?

如何在Axum中将内容作为文件下载返回?
EN

Stack Overflow用户
提问于 2022-08-11 19:02:45
回答 1查看 274关注 0票数 2

我有一个用作代理的Rust应用程序。从用户的角度来看,有一个web前端。这包含一个按钮,当调用该按钮时,该按钮将触发对Rust应用程序的GET请求。这反过来调用返回CSV文件的外部端点。

我想要的是当用户单击该按钮时,将文件下载到浏览器。现在,CSV文件的内容将返回给浏览器,而不是文件本身。

代码语言:javascript
运行
复制
use std::net::SocketAddr;

use axum::{Router, Server};
use axum::extract::Json;
use axum::routing::get;

pub async fn downloadfile() -> Result<Json<String>, ApiError> {
    let filename = ...;
    let endpoint = "http://127.0.0.1:6101/api/CSV/DownloadFile";
    let path = format!("{}?filename={}", endpoint, filename);

    let response = reqwest::get(path).await?;
    let content = response.text().await?;

    Ok(Json(content))
}

pub async fn serve(listen_addr: SocketAddr) {
    let app = Router::new()
        .route("/downloadfile", get(downloadfile));

    Server::bind(&listen_addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

我理解获取内容的原因是因为我将内容字符串作为JSON返回。这说得通。但是,我需要更改什么才能返回文件本身,以便浏览器直接为用户下载?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 16:56:00

我已经解决了这个问题,现在将CSV作为一个文件返回。下面是起作用的函数:

代码语言:javascript
运行
复制
use axum::response::Headers;
use http::header::{self, HeaderName};

pub async fn downloadfile() -> Result<(Headers<[(HeaderName, &'static str); 2]>, String), ApiError> {
    let filename = ...;
    let endpoint = "http://127.0.0.1:6101/api/CSV/DownloadFile";
    let path = format!("{}?filename={}", endpoint, filename);

    let response = reqwest::get(path).await?;
    let content = response.text().await?;

    let headers = Headers([
        (header::CONTENT_TYPE, "text/csv; charset=utf-8"),
        (header::CONTENT_DISPOSITION, "attachment; filename=\"data.csv\""),
    ]);

    Ok((headers, content))
}

我仍然在为能够设置一个动态文件名而挣扎,但这是另一个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73325707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档