Как возвращать файлы с русскими буквами в названии через 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.

→ Ссылка