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:
main.rs
Cargo.toml
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;
}

Wenn eine Datei im ersten Verzeichnis nicht gefunden wird, wird sie im zweiten Verzeichnis gesucht.

  • Bietet Unterstützung für rust-embed. Zum Beispiel:
main.rs
Cargo.toml
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;
}

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).