Enviar archivo

Salvo puede enviar archivos de varias maneras:

Archivo con nombre

Salvo proporciona salvo::::NamedFile, que se puede utilizar para enviar archivos de manera eficiente al cliente. No carga todos los archivos en el caché, pero carga parte del contenido de acuerdo con el Range solicitado enviado al cliente.

En realidad, pasar Response::send_file es solo una forma simplificada de usar NamedFile; si necesita más control sobre el archivo enviado, puede usar NamedFileBuilder.

Se puede crear un NamedFileBuilder mediante NamedFile::builder:

#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
     let builder = NamedFile::builder("/file/to/path");
}

Puede realizar algunas configuraciones y luego enviar el archivo:

#[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;
}

Servidor Estático

Middleware que sirve archivos estáticos o archivos incrustados como un servicio.

  • 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, se encontrará en la segunda carpeta.

  • 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 usar el archivo configurado aquí cuando no se pueda encontrar el archivo. Esto sigue siendo útil para algunas aplicaciones de sitios web de una sola página.