it-swarm.com.ru

UTF-8 Кодировка имени в скачанном файле

Я пытаюсь позволить пользователю загрузить файл Excel с японским именем. Кажется, что он работает только IE 8 и другие IE и Firefox, он не работает. Пожалуйста, предложите мне, как справиться с этим.

String fileName = dateString+"_マイページ情報.xls";
byte[] data = writer.getData();
response.setContentType("application/ms-Excel");
response.setContentLength(data.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName));
22
zawhtut

Я понял это следующим образом.

fileName = dateString+"_マイページ情報.xls"; 
fileName = URLEncoder.encode(fileName,"UTF-8"); 
try {
        response.setContentType("application/ms-Excel; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        if(browserType.equals("IE")||browserType.equals("Chrome"))
            response.setHeader("Content-Disposition","attachment; filename="+fileName);
        if(browserType.endsWith("Firefox"))
            response.setHeader("Content-Disposition","attachment; filename*=UTF-8''"+fileName);
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
35
zawhtut

Используйте метод setCharacterEncoding :

Устанавливает кодировку символов (MIME charset) отправляемого ответа клиенту, например, UTF-8. Если кодировка символов имеет уже был установлен setContentType (Java.lang.String) или setLocale (Java.util.Locale), этот метод переопределяет его. Вызов setContentType (Java.lang.String) со строкой text/html и вызов этого метода со строкой UTF-8 эквивалентен вызов setContentType со строкой text/html; кодировка = UTF-8.

Этот метод может вызываться повторно для изменения кодировки символов . Этот метод не имеет никакого эффекта, если он вызывается после того, как getWriter был вызывается или после того, как ответ был принят.

Измените ваш код следующим образом:

response.setContentType("application/ms-Excel; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName, "UTF-8"));
9
Ankur Lathi

В вызове URLEncoder передайте второй необязательный аргумент "UTF-8" . См. http://docs.Oracle.com/javase/1.4.2/docs/api/Java/net/URLEncoder.html# кодировать (Java.lang.String,% 20Java.lang.String)

5
Tom

Вот что я сделал, и он работает в ВСЕХ браузерах, которые я пробовал (Chrome, Firefox и Safari). Кроме того, мне не нужно было писать какой-либо специфичный для браузера код.

По этой ссылке: http://blogs.msdn.com/b/ieinternals/archive/2010/06/07/content-disposition-attachment-and-international-unicode-characters.aspx

все браузеры будут пытаться извлечь имя файла из пути компонент URL

Итак, если браузер запрашивает URL с именем файла в конце, он будет правильно называть файл. Это похоже на правду для всех браузеров.

В моем личном случае клиент не знает имя файла, которое он хочет загрузить. Наша система выполняет GET для файла на основе идентификатора. Например:

/api/file/download/<file_id>

Итак, я сделал, чтобы этот API посмотрел имя файла (мы храним его в db, file_id), закодировал его по URL-адресу и redirect ко второму API, который включает имя файла. Например:

/api/file/download/<file_id>/<url-encoded filename>

Затем 2-й API будет использовать file_id для поиска и потоковой передачи содержимого файла, а браузер будет использовать часть имени файла для именования загруженного файла. 

ПРИМЕЧАНИЕ. Второй API игнорирует имя файла (не нужно). Он также устанавливает заголовок Content-Disposition равным «attachment»; только (НЕ устанавливайте имя файла. Пусть браузер получит его по URL.)

2
yngwietiger

ниже работает нормально.

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );
0
mingming chen