發送文件
Salvo 可以通過以下一些方式發送文件:
NamedFile
Salvo 提供了 salvo::fs::NamedFile
, 可以用它高效地發送文件到客戶端. 它並不會把文件都加載入緩存, 而是根據請求的 Range
加載部分內容發送至客戶端.
實際上, 通過 Response::send_file
只是一種簡化的使用 NamedFile
的方式, 如果你需要對發送的文件進行更多的控制, 可以使用 NamedFileBuilder
.
通過 NamedFile::builder
可以創建 NamedFileBuilder
:
#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
let builder = NamedFile::builder("/file/to/path");
}
可以做一些設置, 然後發送文件:
#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
NamedFile::builder("/file/to/path").attached_name("image.png").send(req.headers(), res).await;
}
Serve Static
將靜態文件或者內嵌的文件作爲服務提供的中間件.
StaticDir
提供了對靜態本地文件夾的支持. 可以將多個文件夾的列表作爲參數. 比如:use salvo::prelude::*; use salvo::serve_static::StaticDir; #[tokio::main] async fn main() { tracing_subscriber::fmt().init(); let router = Router::with_path("<**path>").get( StaticDir::new([ "examples/static-dir-list/static/boy", "examples/static-dir-list/static/girl", ]) .defaults("index.html") .auto_list(true), ); let acceptor = TcpListener::new("127.0.0.1:5800").bind().await; Server::new(acceptor).serve(router).await; }
[package] name = "example-static-dir-list" version = "0.1.0" edition = "2021" publish = false [dependencies] salvo = { workspace = true, features = ["serve-static"] } tokio = { version = "1", features = ["macros"] } tracing = "0.1" tracing-subscriber = "0.3"
如果在第一個文件夾中找不到對應的文件, 則會到第二個文件夾中找.
提供了對
rust-embed
的支持, 比如:use rust_embed::RustEmbed; use salvo::prelude::*; use salvo::serve_static::static_embed; #[derive(RustEmbed)] #[folder = "static"] struct Assets; #[tokio::main] async fn main() { tracing_subscriber::fmt().init(); let router = Router::with_path("<**path>").get(static_embed::<Assets>().fallback("index.html")); let acceptor = TcpListener::new("127.0.0.1:5800").bind().await; Server::new(acceptor).serve(router).await; }
[package] name = "example-static-embed-files" version = "0.1.0" edition = "2021" publish = false [dependencies] rust-embed = { workspace = true } salvo = { workspace = true, features = ["serve-static"] } tokio = { version = "1", features = ["macros"] } tracing = "0.1" tracing-subscriber = "0.3"
with_fallback
可以設置在文件找不到時, 用這裏設置的文件代替, 這個對應某些單頁網站應用來還是有用的.