Фактическое имя файла по умолчанию никогда не отправляется клиенту. A filename - это идентификатор, который поступает из ОС, а не какое-либо свойство самого файла. Это похоже на имя указателя, указывающего на место в памяти или на диске, где хранится содержимое этого файла. Когда вы отправляете файл через net, вы отправляете только его содержимое, необработанные данные вместе с некоторым информационным заголовком. Там вы можете указать директиву для клиента, чтобы установить имя файла в своей файловой системе, если хотите (как описано ниже).
Если не указано иное, браузер просто использует конечную точку запроса (/download
) и некоторую информацию заголовка, такую как параметр media-type
(или MIME-Type
) из заголовка Content-Type
ответа, чтобы получить подходящее имя файла. В Flask класс Response
по умолчанию устанавливает MIME-Type
каждого ответа на text/html
, если не указано иное ( источник ).
Итак, в вашем случае браузер принимает конечная точка /download
в качестве имени файла и выбирает расширение в соответствии с MIME-Type
, что составляет text/html
=> donwload.html
. Вы можете создать подкласс класса Response
и настроить поведение по умолчанию, что повлияет на все ваши ответы, или вы можете установить имя файла (вместе с расширением), которое должно отображаться в диалоговом окне браузера «Сохранить как», с параметром filename
в заголовке Content-Disposition
каждый ответ:
return app.response_class(
stream_and_remove_file(),
headers={'Content-Disposition': "attachment; filename=testfile.res"}
)
Свойство attachment
просто указывает браузеру загружать содержимое ответа в виде файла и не пытаться его отобразить.