Servidor Estático

Middleware que proporciona archivos estáticos o archivos incrustados como servicios.

Principales características

  • StaticDir proporciona soporte para carpetas locales estáticas. Puede tomar una lista de varias carpetas como argumento. Por ejemplo:

    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([
                "examples/static-dir-list/static/boy",
                "examples/static-dir-list/static/girl",
            ])
            .defaults("index.html")
            .auto_list(true),
        );
    
        let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
        Server::new(acceptor).serve(router).await;
    }
    
    [package]
    name = "example-static-dir-list"
    version = "0.1.0"
    edition = "2021"
    publish = false
    
    
    [dependencies]
    salvo = { workspace = true, features = ["serve-static"] }
    tokio = { version = "1", features = ["macros"] }
    tracing = "0.1"
    tracing-subscriber = "0.3"
    

    Si el archivo correspondiente no se encuentra en la primera carpeta, buscará en la segunda carpeta.

    StaticDir admite el envío de archivos comprimidos primero cuando existen archivos comprimidos. Por ejemplo, si hay archivos index.html, index.html.gz, index.html.zst, index.html.br, entonces index.html.gz, index.html.zst, index.html.br se consideran versiones precomprimidas de index.html, y los archivos comprimidos correspondientes se enviarán de acuerdo con el información requerida.

  • Proporciona soporte para rust-embed, como por ejemplo:

    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("127.0.0.1:5800").bind().await;
        Server::new(acceptor).serve(router).await;
    }
    
    [package]
    name = "example-static-embed-files"
    version = "0.1.0"
    edition = "2021"
    publish = false
    
    
    [dependencies]
    rust-embed = { workspace = true }
    salvo = { workspace = true, features = ["serve-static"] }
    tokio = { version = "1", features = ["macros"] }
    tracing = "0.1"
    tracing-subscriber = "0.3"
    

    with_fallback se puede configurar para reemplazar el archivo configurado aquí cuando no se encuentra el archivo, lo cual es útil para algunas aplicaciones de sitios web de una sola página.