Java локализованные имена файлов - PullRequest
6 голосов
/ 19 января 2011

Как я могу установить локализованные имена файлов в java. В настоящее время каждый раз, когда я нажимаю на локализованный файл с именем файла, отличным от ascii, в моем приложении, появляется диалоговое окно сохранения Windows, но оно не отображает имя файла должным образом, если кодировка выше ISO-88859-1.

Это мой код, который сохраняет файл.

            InputStream inputStream = null;
 try {
  response.resetBuffer();
  response.setContentType(fileStream.getContentType());
  response.setContentLength((int) fileStream.getContentLength());
  response.addHeader("Content-Disposition",
    "attachment;filename=\"" + fileName + "\"");
  ServletOutputStream stream = response.getOutputStream();
  byte[] buffer = new byte[1024];
  int read = 0;
  int total = 0;
  inputStream = fileStream.getInputStream();
  while ((read = inputStream.read(buffer)) > 0) {
   stream.write(buffer, 0, read);
   total += read;
  }
  response.flushBuffer();
 } finally {
  if (inputStream != null) {
   inputStream.close();
  }
 }

Я был бы очень полезен, если бы кто-то мог поделиться своими идеями о том, как решить эту проблему. Заранее спасибо.

Ответы [ 4 ]

13 голосов
/ 19 января 2011

То, что говорит gustafc, верно, но не дает вам того, кем вы хотите быть. RFC 2231 позволяет использовать альтернативный формат для параметров не ASCII Content-Type и Content-Disposition, но не все браузеры поддерживают его. К сожалению, наиболее вероятный способ - игнорировать высказывание RFC 2183 и использовать в ответе кодированные слова RFC 2047 :

response.addHeader("Content-Disposition", "attachment; " +
    "filename=\"" + MimeUtility.encodeWord(fileName, "utf-8", "Q") + "\"");

Обратите внимание, что это может работать не для всех браузеров. Некоторые варианты IE требуют, чтобы вы вместо этого кодировали URL-адрес:

response.addHeader("Content-Disposition",
    "attachment; filename=" + URLEncoder.encode(filename, "utf-8"));
4 голосов
/ 19 апреля 2011

Я столкнулся с аналогичными проблемами с именами файлов, содержащими греческие символы. Я использовал код, указанный в ответе выше (спасибо dkarp), в сочетании с определением, какой браузер используется. это результат:

String user_agent = request.getHeader("user-agent");
boolean isInternetExplorer = (user_agent.indexOf("MSIE") > -1);
if (isInternetExplorer) {
    response.setHeader("Content-disposition", "attachment; filename=\"" + URLEncoder.encode(filename, "utf-8") + "\"");
} else {
    response.setHeader("Content-disposition", "attachment; filename=\"" + MimeUtility.encodeWord(filename) + "\"");
}

Я протестировал его с Firefox 3.6, Chrome 10.0 и Internet Explorer 8, и, похоже, он работает нормально.

2 голосов
/ 19 января 2011

Из в разделе 2.3 спецификации кажется, что вы не можете использовать символы не-US-ASCII:

Ток [RFC 2045] грамматика ограничивает значения параметров (и, следовательно, Content-Disposition filenames) в US-ASCII. Мы признаем великое желательность разрешения произвольных наборов символов в именах файлов, но это выходит за рамки этого документа, чтобы определить необходимые механизмы. Мы ожидаем, что базовая [RFC 1521] `стоимость ' Спецификация когда-нибудь будет изменена, чтобы разрешить использование не-US-ASCII символов, и в это же время в Параметр имени файла Content-Disposition.

1 голос
/ 13 ноября 2012

Хотя это старый вопрос, он все еще актуален.Я нашел решение, которое работает для всех моих браузеров.

Смотрите мой пост в другой теме: Java сервлет скачать имя файла специальные символы

Короче говоря, браузеры ожидают, что значение в параметре filename закодировано в собственной кодировке браузера (если для параметра filename не задана другая кодировка).Родная кодировка браузера обычно - utf-8 (FF, Opera, Chrome), но для IE это win-1250.Следовательно, если мы поместим значение в filename параметр, который кодируется utf-8 / win-1250 в соответствии с браузером пользователя, он должен работать.

Например, если у нас есть файл с именем omáčka.xml,для FireFox, Opera и Chrome I ответ этот заголовок (закодированный в utf-8):

Content-Disposition: attachment; filename="omáčka.xml"

и для IE I ответ этот заголовок (закодированный в win-1250):

Content-Disposition: attachment; filename="omáèka.jpg"

Пример Java в моем посте , который упоминается выше.

Note # 1 (@dkarp) :

Помните об использовании URLEncoder.encode (), так как этот метод не кодирует входную строку в кодировку url.Этот метод кодирует входные строки в кодировку формы, которая очень похожа, но отличается в некоторых случаях - например, пробел '' кодируется как '+' вместо '% 20'.

Для правильного кодирования URL вамлучше использовать класс URI:

URI uri = new URI(null, null, "foo-ä-€.html", null);
System.out.println(uri.toASCIIString());
...