Dateien senden
Salvo bietet mehrere Möglichkeiten zum Senden von Dateien:
NamedFile
Salvo stellt salvo::fs::NamedFile bereit, das effizient Dateien an Clients senden kann. Es lädt nicht die gesamte Datei in den Speicher, sondern liest und sendet nur die Teile, die vom Client basierend auf dem Range-Header angefordert werden.
In der Praxis ist die Verwendung von Response::send_file eine vereinfachte Methode zur Nutzung von NamedFile. Wenn Sie mehr Kontrolle über die Dateiübertragung benötigen, können Sie NamedFileBuilder verwenden.
Sie können einen NamedFileBuilder über NamedFile::builder erstellen:
#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
let builder = NamedFile::builder("/file/to/path");
}
Nach der Konfiguration des Builders können Sie die Datei senden:
#[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;
}
Statische Dateien bereitstellen
Middleware zum Bereitstellen statischer oder eingebetteter Dateien.
StaticDir bietet Unterstützung für das Bereitstellen statischer Dateien aus lokalen Verzeichnissen. Sie können eine Liste mehrerer Verzeichnisse als Argumente übergeben. Zum Beispiel:
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
Wenn eine Datei im ersten Verzeichnis nicht gefunden wird, wird sie im zweiten Verzeichnis gesucht.
- Bietet Unterstützung für
rust-embed. Zum Beispiel:
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
Die Methode with_fallback ermöglicht es, eine Fallback-Datei anzugeben, die bereitgestellt wird, wenn die angeforderte Datei nicht gefunden wird. Dies ist besonders nützlich für Single-Page-Anwendungen (SPAs).