Enviar Arquivos
O Salvo pode enviar arquivos das seguintes formas:
NamedFile
O Salvo fornece salvo::fs::NamedFile
, que pode ser usado para enviar arquivos ao cliente de forma eficiente. Ele não carrega todo o arquivo no cache, mas sim carrega partes do conteúdo conforme o Range
da requisição e envia ao cliente.
Na prática, usar Response::send_file
é apenas uma forma simplificada de utilizar o NamedFile
. Se você precisar de mais controle sobre o arquivo enviado, pode usar o NamedFileBuilder
.
Você pode criar um NamedFileBuilder
através de NamedFile::builder
:
#[handler]
async fn send_file(req: &mut Request, res: &mut Response) {
let builder = NamedFile::builder("/file/to/path");
}
É possível fazer algumas configurações e então enviar o arquivo:
#[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;
}
Servir Arquivos Estáticos
Middleware para servir arquivos estáticos ou arquivos embutidos.
StaticDir
oferece suporte a pastas locais estáticas. Você pode passar uma lista de várias pastas como argumento. Por exemplo:
static-dir-list/src/main.rs
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:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
Se o arquivo não for encontrado na primeira pasta, ele será procurado na segunda.
- Oferece suporte a
rust-embed
, por exemplo:
static-embed-files/src/main.rs
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:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
with_fallback
permite definir um arquivo substituto quando o arquivo não for encontrado, o que é útil para algumas aplicações de página única (SPA).