Этот поток является дубликатом Как закодировать параметр имени файла заголовка Content-Disposition в HTTP? { {1}} Но поскольку этот вопрос был задан давно, и до сих пор нет удовлетворительного ответа (на мой взгляд), я хотел бы спросить еще раз.
Я разрабатываю приложение C ++ CGI, которое доставляет файлы, которые могут содержать специальные символы в их именах, такие как
" weird # € = {}; filename.txt "
Кажется, нет возможности настроить HTTP Content-Dispostion таким образом, чтобы он работал для каждого браузер, например
Я был бы доволен другим решением для каждого браузера.
Вот как далеко я зашел:
Internet Explorer (добавлены двойные кавычки и заменены # и;)
Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"
Firefox (двойные кавычки, похоже, работают. Ничего более to do):
Content-Disposition: attachment; filename="weird # € = { } ; filename.txt"
Другая рабочая альтернатива:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
Chrome
при использовании только двойных кавычек возникают следующие проблемы:
, но это работает:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
Opera
Использование двойных кавычек или использование синтаксиса: filename * = UTF-8 '' ... приводит к следующим проблемам:
РЕДАКТИРОВАТЬ 2: Это было из-за ограничений длины имени файла. Этот синтаксис работает с Opera:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
Safari
€ будет заменен невидимым символом (с использованием двойных кавычек)
нет решения, которое предотвращает эту небольшую проблему
Предложение из другого потока (упомянутое выше) использование
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt
у меня не сработало. Эскейп-символы не будут переведены обратно, или браузер хочет сохранить файл с именем моего приложения cgi. Это потому, что моя кодировка была неправильной. Я не кодировал в соответствии с RFC 5987. Но Safari все равно не использует эту кодировку. Так что пока нет решения для символа €.
Кстати: конвертер UTF-8 http://www.rishida.net/tools/conversion/
Я использовал последнюю версию каждого браузера для этих тестов:
PS: Я перепробовал все специальные символы на клавиатуре. Я использовал в этой ветке только те, которые доставили проблемы.
Я также попробовал имя файла со всеми специальными символами на моей клавиатуре (которые возможны в имени файла), и это не сработало, как это было с приведенной выше тестовой строкой:
Полная тестовая строка:
0 ! § $ % & ( ) = ` ´ { } [ ] ² ³ @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg
Закодированная тестовая строка:
0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
Используя этот метод:
Content-Disposition: attachment; filename*=UTF-8''0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
Я получил следующие результаты:
На данный момент состояние таково, что синтаксис filename * = UTF-8''filname escape sequence " работает во всех браузерах, кроме Safari. И единственный символ, который заменяется с Safari - это €. Думаю, я смогу с этим смириться. Спасибо!
Я заметил некоторые проблемы с длиной имени файла.