Enviando arquivos do servidor em FastAPI
Para enviar arquivos a partir de uma aplicação FastAPI, utiliza-se a classe FileResponse, que herda da classe Response.
Imagine que temos o seguinte projeto FastAPI:
. ├──public │ └── index.html ├── main.py
O arquivo index.html
é um arquivo HTML simples que contém o seguinte conteúdo:
<!DOCTYPE html>
<html>
<head>
<title>www.programicio.com</title>
<meta charset="utf-8" />
</head>
<body>
<h1>Hello www.programicio.com!</h1>
</body>
</html>
Agora, no arquivo main.py
, definimos o código para enviar esse arquivo ao cliente:
from fastapi import FastAPI
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html")
# Alternativa
@app.get("/file", response_class=FileResponse)
def root_html():
return "public/index.html"
O parâmetro obrigatório do construtor de FileResponse
é o caminho do arquivo.
Ao enviar o arquivo, o navegador será capaz de interpretá-lo como um código HTML, exibindo assim a página no navegador.
Por padrão, o navegador tenta interpretar e exibir qualquer arquivo que consiga, como arquivos de texto, imagens ou outros tipos de mídia. Caso o navegador não consiga interpretar o arquivo, ele será baixado automaticamente.
No entanto, pode ser necessário forçar o download de arquivos que normalmente seriam exibidos, como arquivos HTML. Para isso, podemos definir o parâmetro media_type
como application/octet-stream
. Além disso, o parâmetro filename
permite especificar o nome do arquivo no momento do download.
Exemplo:
import mimetypes
from fastapi import FastAPI
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/")
def root():
return FileResponse("public/index.html",
filename="mainpage.html",
media_type="application/octet-stream")
Neste exemplo, O uso do parâmetro media_type="application/octet-stream"
instrui o navegador a tratar o arquivo como binário, forçando o download em vez de exibi-lo.
A propriedade filename
é útil para personalizar o nome do arquivo no momento do download.
Documentação oficial: