powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отдача файла с определенным именем (nginx, Content-Disposition)
2 сообщений из 2, страница 1 из 1
Отдача файла с определенным именем (nginx, Content-Disposition)
    #38281302
fornit1917
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла следующая проблема. Имеется веб-приложение (клиент на js, сервер на php) и некое файловое хранилище. Чтобы скачать файл из хранилища, клиентская часть веб-приложения шлет запрос на серверную, там проверяются права доступа, если все ок, то отдается ссылка на файл. Затем клиентская часть делает редирект на эту ссылку. На сервере файлового хранилища стоит nginx, который и отдает файлы. Имена у файлов представляют собой набор символов (GUID), что не очень нравилось пользователям. Они хотели бы, чтобы при скачивании у файла было такое же имя, как у соответствующей ему сущности в веб-приложении. Поскольку переименовывать файлы очень не хотелось бы по некоторым причинам, я придумал следующее:

1. При формировании ссылки я к ней цепляю GET-параметр, в который помещаю название сущности, которое хотелось бы установить в качестве названия для скачивания файла.

2. В конфиге nginx беру этот параметр и подставляю его в заголовок Content-Disposition.

Вроде бы все заработало как надо, я обрадовался, но как только дело дошло до кириллицы в названии - начались проблемы.
Во-первых, firefox при редиректа на хранилище делает urlencode. И nginx в Content-Disposition подставляет закодированную строку. Соответственно фаерфокс предлагает сохранить файл так же под закодированным именем.
Во-вторых, даже если в Content-Disposition будет незакодированная строка, но в UTF-8 с кириллицей, то всеми любимые IE ничего знать не хочет о том что это UTF-8, интерпретирует его как cp1251 и имя файла получается с кракозябрами.

В общем, данная схема нормально работает только в хроме. Теоретически с проблемой номер 1 (urlencode) можно справиться, если пересобрать nginx из исходников, включив в него модуль ngx_set_misc. Тогда в конфиге nginx можно будет с помощью set_unescape_uri сделать urldecode для имени файла перед тем как вставлять его в заголовок Content-Disposition. Но к этому способу хотелось бы прибегать в последнюю очередь.
А как решить проблему с IE - вообще не знаю.

Был бы очень благодарен за совет, может быть есть гораздо более простой способ решения моей задачи, а я его в упор не вижу.
...
Рейтинг: 0 / 0
Отдача файла с определенным именем (nginx, Content-Disposition)
    #38282077
fornit1917
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел два решение, если кому пригодится

1. Забить на Content-Disposition. Генерить ссылки вида /реальный/путь/к/файлу / user_friendly_имя, а в конфиге nginx просто обрезаю рерайтом последний кусок урла.

2. Content-Disposition оформлять в соответствии RFC5987. Однако это не кроссбраузерно тоже.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отдача файла с определенным именем (nginx, Content-Disposition)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]