кодировка файла загрузки файла сервлета - PullRequest
15 голосов
/ 16 февраля 2011

Я использую инструменты Apache Commons Fileupload для стандартной загрузки файлов. Моя проблема в том, что я не могу получить правильное имя файла загруженных файлов, если они содержат специальные символы (á, é, ú и т. Д.). Все они конвертируются в? знаки.

request.getCharacterEncoding () говорит UTF-8, но байты, которые я получаю в строке fileItem.getName (), одинаковы для всех моих специальных символов.

Можете ли вы помочь мне, что случилось?

(некоторые подробности: использование Firefox 3.6.12, Weblogic 10.3 в Windows)

Это мой фрагмент кода:

 public CommandMsg(HttpServletRequest request) {
    Enumeration names = null;
    if (isMultipart(request)) {
      FileItemFactory factory = new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      try {
        List uploadedItems = upload.parseRequest(request);
        Iterator i = uploadedItems.iterator();
        FileItem fileItem = null;
        while (i.hasNext()) {
          fileItem = (FileItem) i.next();
          if (fileItem.isFormField()) {
            // System.out.println("isFormField");
            setAttribute(fileItem.getFieldName(), fileItem.getString());
          } else {
            String enc = "utf-8";
            enc = request.getCharacterEncoding();
            String fileName = fileItem.getName();
            byte[] fnb = fileItem.getName().getBytes();
            byte[] fnb2 = null;
            try {
                fnb2 = fileItem.getName().getBytes(enc);
                String t1 = new String(fnb);
                String t2 = new String(fnb2);
                String t3 = new String(fnb, enc);
                String t4 = new String(fnb2, enc);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            setAttribute(fileItem.getFieldName(), fileItem);
          }
        }
      } catch (FileUploadException ex) {
        ex.printStackTrace();
      }

// etc..

Ответы [ 4 ]

12 голосов
/ 08 мая 2012

У меня была та же проблема, и я решил ее следующим образом.

ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); 

FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
    FileItemStream item = iter.next();
    String name = item.getFieldName();
    InputStream stream = item.openStream();
    if (item.isFormField()) {
        String value = Streams.asString(stream, "UTF-8");
    } 
}

Если вы основали свой код на примере, приведенном в http://commons.apache.org/fileupload/streaming.html, вам необходимо убедиться, что вы установили UTF-8в двух местах выше.

2 голосов
/ 17 февраля 2011

Решил проблему, явно вызвав .setHeaderEncoding экземпляра ServletFileUpload ("ISO-8858-2").

2 голосов
/ 17 февраля 2011

Вы должны убедиться, что целевая консоль / файл / база данных / где бы вы ни печатали / записывали / вставляли имя файла, также поддерживали UTF-8. Знаки вопроса указывают, что он не настроен на прием UTF-8 и что сама цель знает об этом. В противном случае вы бы просто видели моджибаке .

Поскольку в вопросе отсутствуют подробные сведения о цели, я не могу сделать гораздо больше, чем предложить разобраться в этой статье , чтобы понять, что происходит с закулисными персонажами.

0 голосов
/ 08 мая 2012

Для этих специальных символов вы можете установить кодировку "iso 8859-1".UTF-8, кажется, не работает ..

Если вы не устанавливаете какой-либо тип кодировки .. Тогда машина linux примет кодировку по умолчанию UTF-8, и Windows примет совместимую кодировку

...