Проблема:
Задача следующая: отправить в браузер файл с русскими символами в имени. Проблема заключается в том, что если помещать имя файла в заголовок непосредственно кодом:
Решение:
Ниже приведет кроссбраузерный код (работает в IE 8, FF 9, Opera 11.60, Chrome 16):
Задача следующая: отправить в браузер файл с русскими символами в имени. Проблема заключается в том, что если помещать имя файла в заголовок непосредственно кодом:
response.setHeader("Content-Disposition", "attachment; filename="+fileName);вместо корректного имени получаем кракозябры, а IE 8 вообще выкидывает невнятное сообщение о невозможности загрузки.
Решение:
Ниже приведет кроссбраузерный код (работает в IE 8, FF 9, Opera 11.60, Chrome 16):
if(request.getHeader("user-agent")!=null && request.getHeader("user-agent").indexOf("Firefox")!=-1) // Firefox
response.setHeader("Content-Disposition", "attachment; filename*=utf-8''"+java.net.URLEncoder.encode(fileName, "UTF-8") + ";");
else
response.setHeader("Content-Disposition", "attachment; filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
Спасибо за предложенное решение, взял за основу. Однако, есть проблема - кодер превращает пробел в "+". Так что при скачивании файла его имя, если оно с пробелами, получается искаженным.
ОтветитьУдалитьРешение такое, например: до кодирования заменить в имени файла все пробелы на "*" (она не встречается в именах файлов), а после кодирования - заменить "*" на "%20"
Да, и еще, если делать, как у Вас, то Firefox добавит знак подчёркивания перед именем файла (не знаю, зачем). Проблему решает добавление двойных кавычек, охватывающих весь текст после знака "=":
ОтветитьУдалитьvalue += ";filename*=\"utf-8''" + encodeFilename(rawEncodedFlnm + "\"");
Спасибо за комментарии!
Удалить