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.