如何在Axum中以文件下载的形式返回内容



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

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

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返回。这是有道理的。但是,我需要更改什么才能返回文件本身,以便浏览器直接为用户下载它?

我已经设法解决了它,现在将CSV作为文件返回。以下是有效的功能:

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))
}

我仍然很难设置一个动态文件名,但这是另一个问题。

相关内容

  • 没有找到相关文章

最新更新