Веб-приложения, которые хотят принудительно загружать ресурс, а не напрямую отображать его в веб-браузере, выдают Content-Disposition
заголовок в HTTP-ответе формы:
Content-Disposition: attachment; filename=FILENAME
filename
Параметр может быть использован , чтобы предложить имя файла , в котором ресурс загружается браузером. RFC 2183 (Content-Disposition), однако, утверждает в разделе 2.3 (Параметр имени файла), что имя файла может использовать только символы US-ASCII:
Текущая грамматика [RFC 2045] ограничивает значения параметров (и, следовательно, имена файлов Content-Disposition) US-ASCII. Мы признаем большую желательность разрешения произвольных наборов символов в именах файлов, но это выходит за рамки этого документа, чтобы определить необходимые механизмы.
Тем не менее, существует эмпирическое доказательство того, что большинство популярных веб-браузеров сегодня, по-видимому, допускают символы не-US-ASCII, но (из-за отсутствия стандарта) не согласны со схемой кодирования и спецификацией набора символов имени файла. Тогда возникает вопрос, каковы различные схемы и кодировки, используемые популярными браузерами, если имя файла «naïvefile» (без кавычек и где третья буква U + 00EF) необходимо кодировать в заголовок Content-Disposition?
Для этого вопроса популярными браузерами являются:
- Fire Fox
- Internet Explorer
- Сафари
- Гугл Хром
- опера
источник
Content-Disposition: attachment
.Ответы:
Это обсуждается, включая ссылки на тестирование браузера и обратную совместимость, в предлагаемом RFC 5987 , «Набор символов и кодировка языка для параметров поля заголовка протокола передачи гипертекста (HTTP)».
RFC 2183 указывает, что такие заголовки должны быть закодированы в соответствии с RFC 2184 , который был устаревшим из RFC 2231 , описанного в проекте RFC выше.
источник
Content-Disposition: filename="foo, bar.pdf"
. В результате Firefox загружает файл правильно, но сохраняет.part
расширение (напримерfoo,bar.pdf-1.part
). Тогда, конечно, файл не будет открываться правильно, потому что приложение не связано с.part
. Другие символы ASCII работают нормально.Я знаю, что это старый пост, но он все еще очень актуален. Я обнаружил, что современные браузеры поддерживают rfc5987, который допускает кодирование utf-8 в процентах (в кодировке url). Тогда Наивный файл .txt становится:
Safari (5) не поддерживает это. Вместо этого вам следует использовать стандарт Safari для записи имени файла непосредственно в ваш кодированный заголовок utf-8:
IE8 и старше также не поддерживают его, и вам нужно использовать стандарт IE в кодировке utf-8, в процентах:
В ASP.Net я использую следующий код:
Я протестировал вышеизложенное с помощью IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.
Обновление ноябрь 2013:
Вот код, который я сейчас использую. Мне все еще нужно поддерживать IE8, поэтому я не могу избавиться от первой части. Оказывается, что браузеры на Android используют встроенный менеджер загрузок Android, и он не может надежно анализировать имена файлов стандартным способом.
Вышеизложенное теперь протестировано в IE7-11, Chrome 32, Opera 12, FF25, Safari 6, используя для загрузки следующее имя файла: ^ ~ -_,;. TXT
На IE7 это работает для некоторых символов, но не для всех. Но кого волнует IE7 в наше время?
Это функция, которую я использую для создания безопасных имен файлов для Android. Обратите внимание, что я не знаю, какие символы поддерживаются в Android, но я проверил, что они работают точно:
@TomZ: я тестировал в IE7 и IE8, и оказалось, что мне не нужно избегать апострофа ('). У вас есть пример, где это не удается?
@Dave Van den Eynde: Объединение двух имен файлов в одной строке, как в соответствии с RFC6266, работает за исключением Android и IE7 + 8, и я обновил код, чтобы отразить это. Спасибо за предложение.
@Thilo: понятия не имею о GoodReader или любом другом браузере. Возможно, вам повезет, используя подход Android.
@ Алекс Жуковский: Я не знаю почему, но, как уже говорилось в Connect, это не очень хорошо работает.
источник
Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txt
и браузер пропускает сниффинг? Будет ли это работать?Не существует совместимого способа кодирования не-ASCII-имен в
Content-Disposition
. Совместимость браузера - это беспорядок .Теоретически правильный синтаксис для использования UTF-8 в
Content-Disposition
очень странно:filename*=UTF-8''foo%c3%a4
(да, это звездочка, и никаких цитат кроме пустой одной цитаты в середине)Этот заголовок не совсем стандартный ( спецификация HTTP / 1.1 подтверждает его существование , но не требует, чтобы клиенты его поддерживали).
Существует простая и очень надежная альтернатива: используйте URL, который содержит желаемое имя файла .
Когда имя после последней косой черты соответствует желаемому, вам не нужны дополнительные заголовки!
Этот трюк работает:
И если ваш сервер поддерживает перезапись URL (например,
mod_rewrite
в Apache), то вы можете полностью скрыть часть скрипта.Символы в URL должны быть в кодировке UTF-8 побитно:
источник
/:id/:filename
Метод очень прост и работает, спасибо!Content-Disposition
и создавать очень интересные имена файлов вместо (они будут сгенерированы с вашего пути). Таким образом, единственное решение для сохранения здравомыслия - это просто установитьContent-Disposition: attachment
и передать желаемое имя файла в качестве последнего компонента пути:RFC 6266 описывает « Использование поля заголовка расположения содержимого в протоколе передачи гипертекста (HTTP) ». Цитата из этого:
И в разделе их примеров :
В Приложении D также приведен длинный список предложений по повышению совместимости. Он также указывает на сайт, который сравнивает реализации . Текущие универсальные тесты, подходящие для общих имен файлов, включают:
filename
».Этот RFC 5987, в свою очередь, ссылается на RFC 2231 , который описывает фактический формат. 2231 в основном для почты, а 5987 сообщает нам, какие части можно использовать и для заголовков HTTP. Не путайте это с заголовками MIME, используемыми внутри тела
multipart/form-data
HTTP , которое регулируется RFC 2388 ( в частности, раздел 4.4 ) и проектом HTML 5 .источник
Следующий документ, связанный с проектом RFC, упомянутым Джимом в его ответе, дополнительно рассматривает этот вопрос и, безусловно, заслуживает прямой заметки:
Тестовые случаи для заголовка HTTP Content-Disposition и кодировки RFC 2231/2047
источник
в asp.net mvc2 я использую что-то вроде этого:
Я думаю, что если вы не используете mvc (2), вы можете просто закодировать имя файла, используя
источник
Поместите имя файла в двойные кавычки. Решил проблему для меня. Нравится:
http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download
Я протестировал несколько вариантов. Браузеры не поддерживают спецификации и действуют по-другому, я считаю, что двойные кавычки - лучший вариант.
источник
&
,%
, и#
т.д. Таким образом , он решает , что.Я использую следующие фрагменты кода для кодирования (при условии, что fileName содержит имя файла и расширение файла, то есть: test.txt):
PHP:
Ява:
источник
rawurlencode
в PHP по крайней мере дляfilename*=
заголовка расположения, посколькуvalue-chars
используется вext-value
RFC 6266-> RFC 5987 (см. Tools.ietf.org/html/rfc6266#section-4.1 & tools.ietf.org/html/rfc5987#section -3.2.1 ) не разрешает пространство без экранирования процентов (filename=
с другой стороны, кажется, что это может разрешить пространство без экранирования вообще, хотя здесь должен присутствовать только ASCII). Нет необходимости кодировать с полной строгостью rawurlencode, поэтому можно убратьВ ASP.NET Web API я кодирую имя файла:
источник
Я протестировал следующий код во всех основных браузерах, включая более старые Explorers (через режим совместимости), и он хорошо работает везде:
источник
Я закончил со следующим кодом в моем скрипте "download.php" (на основе этого поста и этих тестовых случаев ).
При этом используется стандартный способ имени файла = "...", если используются только символы iso-latin1 и "safe"; если нет, то добавляется имя файла * = UTF-8 '' в кодировке URL. В соответствии с этим конкретным тестовым примером , он должен работать с MSIE9 и выше, и на последних FF, Chrome, Safari; в более низкой версии MSIE он должен предлагать имя файла, содержащее версию имени файла ISO8859-1, с подчеркиванием на символах, не входящих в эту кодировку.
Конечная нота: макс. Размер каждого поля заголовка на Apache составляет 8190 байт. UTF-8 может содержать до четырех байтов на символ; после rawurlencode это x3 = 12 байт на один символ. Довольно неэффективно, но теоретически все еще должно быть возможно иметь более 600 «улыбок»% F0% 9F% 98% 81 в имени файла.
источник
Если вы используете серверную часть nodejs, вы можете использовать следующий код, который я нашел здесь
источник
encodeURI(str)
. Как пример с датами в имени файла:encodeURIComponent('"Kornél Kovács 1/1/2016')
=> "Kornél Kovács 1% 2F1% 2F2016" противencodeURI('"Kornél Kovács 1/1/2016')
=> "Kornél Kovács 1/1/2016"В PHP это сделало это для меня (при условии, что имя файла в кодировке UTF8):
Протестировано на IE8-11, Firefox и Chrome.
Если браузер может интерпретировать имя файла * = utf-8, он будет использовать версию имени файла в формате UTF8, иначе он будет использовать декодированное имя файла. Если ваше имя файла содержит символы, которые не могут быть представлены в ISO-8859-1, вы можете использовать их
iconv
вместо этого.источник
Просто обновление, так как я пробовал все это сегодня в ответ на проблему клиента
источник
PHP фреймворк Symfony 4 имеет
$filenameFallback
вHeaderUtils::makeDisposition
. Вы можете посмотреть на эту функцию для деталей - это похоже на ответы выше.Пример использования:
источник
Классическое решение ASP
Большинство современных браузеров поддерживают передачу
Filename
какUTF-8
сейчас, но, как и в случае с решением для выгрузки файлов, которое я использую и которое основано на FreeASPUpload.Net (сайт больше не существует, ссылки на archive.org ), оно не будет работать в качестве парсера Двоичный метод полагался на чтение однобайтовых строк в кодировке ASCII, что прекрасно работало, когда вы передавали данные в кодировке UTF-8, пока не получили символы, которые ASCII не поддерживает.Однако я смог найти решение, чтобы заставить код читать и анализировать двоичный файл как UTF-8.
Кредит идет на Чистую Выгрузку Файла ASP , реализуя
BytesToString()
функцию изinclude_aspuploader.asp
моего собственного кода, который я смог заставитьUTF-8
работать с именами файлов.Полезные ссылки
Multipart / form-data и UTF-8 в приложении ASP Classic
Различия в формате Юникод, UTF, ASCII, ANSI
источник
У нас была похожая проблема в веб-приложении, и в итоге мы прочитали имя файла из HTML
<input type="file">
и установили его в закодированной форме в новом HTML<input type="hidden">
. Конечно, нам пришлось удалить путь типа «C: \ fakepath \», который возвращают некоторые браузеры.Конечно, это не дает прямого ответа на вопрос ОП, но может быть решением для других.
источник
Я обычно URL-кодирую (с% xx) имена файлов, и это, кажется, работает во всех браузерах. Вы могли бы хотеть сделать некоторые тесты так или иначе.
источник