HTTP Content-Disposition filename и кириллица

13.02.2013

Заголовок Content-Disposition вместе с директивой attachment помогают заставить браузер скачивать файл по ссылке, вместо его отображения. Параметр filename позволяет задать для приложенного файла свое имя. В документе RFC 2183, который описывает использование этого заголовка, ссылающемся в свою очередь на RFC 2045, для значений параметров разрешено использовать только US-ASCII символы. Это означает, что мы не можем задать имя файла, как параметр, например, с использование символов кириллицы. Практика показывает, что современные браузеры умеют корректно обрабатывать этот параметр и с символами, находящимися за пределами US-ASCII таблицы.

Для корректной обработки браузерами значений параметра filename можно использовать такую функцию:

public static String getContentDespositionFilename(String agent, String fileName) {
        try {
            boolean isInternetExplorer = (agent.toLowerCase().indexOf("msie") > -1);
            byte[] fileNameBytes = fileName.getBytes((isInternetExplorer) ? ("windows-1251") : ("utf-8"));
            String dispositionFileName = "";
            for (byte b : fileNameBytes) {
                dispositionFileName += (char) (b & 0xff);
            }
            return dispositionFileName;
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(CommonUtils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return fileName;
    }
Источники