Загрузка файла файла сервлета

Я использую средства Apup 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..

Ответы

Ответ 1

У меня была такая же проблема, и я решил это так.

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

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

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

Ответ 3

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

Ответ 4

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

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