Envoi de Fichiers
Salvo permet d'envoyer des fichiers de plusieurs manières :
NamedFile
Salvo fournit salvo::fs::NamedFile, qui peut être utilisé pour envoyer efficacement des fichiers aux clients. Il ne charge pas l'intégralité du fichier en mémoire ; à la place, il lit et envoie uniquement les parties demandées par le client en fonction de l'en-tête Range.
En pratique, utiliser Response::send_file est une manière simplifiée d'utiliser NamedFile. Si vous avez besoin d'un contrôle plus fin sur la livraison des fichiers, vous pouvez utiliser NamedFileBuilder.
Vous pouvez créer un NamedFileBuilder via NamedFile::builder :
#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
let builder = NamedFile::builder("/file/to/path");
}
Après avoir configuré le builder, vous pouvez envoyer le fichier :
#[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;
}
Service de Fichiers Statiques
Middleware pour servir des fichiers statiques ou des fichiers intégrés.
StaticDir fournit un support pour servir des fichiers statiques à partir de répertoires locaux. Vous pouvez passer une liste de plusieurs répertoires en arguments. Par exemple :
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:8698").bind().await;
Server::new(acceptor).serve(router).await;
}
[package]
name = "example-static-dir-list"
version.workspace = true
edition.workspace = true
publish.workspace = true
rust-version.workspace = true
[dependencies]
salvo = { workspace = true, features = ["serve-static"] }
tokio = { workspace = true, features = ["macros"] }
tracing.workspace = true
tracing-subscriber.workspace = true
Si un fichier n'est pas trouvé dans le premier répertoire, il sera recherché dans le second.
- Fournit un support pour
rust-embed. Par exemple :
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:8698").bind().await;
Server::new(acceptor).serve(router).await;
}
[package]
name = "example-static-embed-files"
version.workspace = true
edition.workspace = true
publish.workspace = true
rust-version.workspace = true
[dependencies]
rust-embed.workspace = true
salvo = { workspace = true, features = ["serve-static"] }
tokio = { workspace = true, features = ["macros"] }
tracing.workspace = true
tracing-subscriber.workspace = true
La méthode with_fallback vous permet de spécifier un fichier de secours à servir lorsque le fichier demandé n'est pas trouvé. Cela est particulièrement utile pour les applications monopages (SPA).