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 :
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;
}

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 :
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;
}

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