我正在使用
warp
编写一个简单的 Web 服务器。我遇到了存储在“动态”目录中的图像文件的问题,即目录具有静态前缀,但可能会被重命名。我成功解析了正确的文件,例如“1/image.png”解析为“1-dynamic-name/image.png”。但我不明白如何将二进制文件内容返回给客户端。
我当前的方法如下(为清楚起见缩短):
路由:
let dyn_image = warp::path("base").and(warp::path::param::<u32>())
.and(warp::path::param::<String>()).and(warp::path::end())
.and(warp::get()).and_then(dyn_image);
warp::serve(dyn_image).run(([0, 0, 0, 0], 8000)).await;
解决:
pub async fn dyn_image(idx: u32, image: String) -> Result<impl warp::Reply, Rejection> {
let mut img_dir: PathBuf = ...
// Resolving the dynamic directory
if img_dir.exists() {
// How can I now serve the image file back to the client?
return Ok(warp::reply::?); // What's the correct reply?
}
Err(warp::reject())
}
我正在为实际的回复内容而苦苦挣扎。据我阅读文档,仅实现了
reply::json
和 reply::html
来方便创建响应。但是二进制数据是如何处理的呢?我是否需要一个流,我可以像warp::fs::file("...")
一样直接指定文件,还是将整个文件读入缓冲区?我还看到了类似ResponseBuilder
?
您返回的结果返回类型
Result<impl warp::Reply, Rejection>
可以是许多不同的数据类型。例如,您可以创建一个包含文件数据的 http::Response
。或者甚至实现您自己的自定义数据类型,为您设置标题。
use std::fs;
use warp::{Filter, http::Response};
return warp::any().map(|| {
Response::builder()
.header("Content-Type", "application/octet-stream")
.body(fs::read_to_string(file_path))
代码修改自 warp::reply 文档。