|
|
|
Отдача файла с определенным именем (nginx, Content-Disposition)
|
|||
|---|---|---|---|
|
#18+
Добрый день. Возникла следующая проблема. Имеется веб-приложение (клиент на 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 - вообще не знаю. Был бы очень благодарен за совет, может быть есть гораздо более простой способ решения моей задачи, а я его в упор не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 11:42 |
|
||
|
Отдача файла с определенным именем (nginx, Content-Disposition)
|
|||
|---|---|---|---|
|
#18+
Нашел два решение, если кому пригодится 1. Забить на Content-Disposition. Генерить ссылки вида /реальный/путь/к/файлу / user_friendly_имя, а в конфиге nginx просто обрезаю рерайтом последний кусок урла. 2. Content-Disposition оформлять в соответствии RFC5987. Однако это не кроссбраузерно тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 20:51 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38281302&tid=1341791]: |
0ms |
get settings: |
6ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
405ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 708ms |

| 0 / 0 |
