ファイルの送信
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;
}
静的ファイルの提供
静的ファイルや埋め込まれたファイルをサービスとして提供するミドルウェアです。
StaticDir
はローカルの静的フォルダをサポートしています。複数のフォルダのリストを引数として渡せます。例:
static-dir-list/src/main.rs
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([
"static-dir-list/static/boy",
"static-dir-list/static/girl",
"static/boy",
"static/girl",
])
.include_dot_files(false)
.defaults("index.html")
.auto_list(true),
);
let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
最初のフォルダに対応するファイルが見つからない場合、2番目のフォルダを探します。
rust-embed
のサポートも提供しています。例:
static-embed-files/src/main.rs
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("0.0.0.0:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
with_fallback
を使用すると、ファイルが見つからない場合に代わりに使用するファイルを設定できます。これはシングルページアプリケーションなどで有用です。