Как возвращать файлы с русскими буквами в названии через Fastapi?
Сделал на fastapi сервис, который возвращает файл по ссылке. Примитивно выглядит так:
import os
from fastapi import FastAPI, HTTPException
from starlette.responses import FileResponse
app = FastAPI()
db = DataBase(config=CONFIG.mysql)
@app.get('/v1.0/get_file')
async def get_file(id_file: str):
# ...
file = db.get_file(id_file)
# ...
return FileResponse(file.path, filename=file.file_name)
Пока file.file_name не содержит русских символов, файл успешно скачивается. Как только там появляются русские буквы, мой код падает с ошибкой:
...
File
"/home/servicemanager/services/file_service/venv/lib/python3.7/site-packages/starlette/datastructures.py",
line 606, in setdefault
set_value = value.encode("latin-1")
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 22-26: ordinal not in range(256)
Не понимаю, откуда вообще берется подобная ошибка. У меня все в кодировке utf-8. Я предположил, что возможно мне БД возвращает что-то не в той кодировке, но даже если я явно пишу вызов FileResponse(file.path, filename='отчет.xlsx') мой код все равно возвращает ошибку. Помогите, пожалуйста, разобраться в происходящем.
Ответы (1 шт):
Автор решения: Sergey Gornostaev
→ Ссылка
Этого должно хватить
from urllib.parse import quote_plus
...
return FileResponse(file.path, filename=quote_plus(file.file_name))
Но лучше ознакомиться со стандартами кодирования в HTTP.