Текст UTF-8 искажается, когда форма публикуется как multipart / form-data - PullRequest
49 голосов
/ 13 февраля 2009

Я загружаю файл на сервер. HTML-форма для загрузки файла имеет 2 поля:

  1. Имя файла - текстовое поле HTML, в котором пользователь может дать имя на любом языке.
  2. Загрузка файла - файл HTMl, в котором пользователь может указать файл с диска для загрузки.

Когда форма отправлена, содержимое файла получено правильно. Однако когда имя файла (пункт 1 выше) читается, оно искажается. Символы ASCII отображаются правильно. Когда имя дается на каком-либо другом языке (немецком, французском и т. Д.), Возникают проблемы.

В методе сервлета кодировка символов запроса установлена ​​в UTF-8. Я даже попытался сделать фильтр, как упомянуто - Как я могу сделать этот код для отправки текстовой области формы UTF-8 с jQuery / Ajax? , Кажется, что искажено только имя файла.

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

Используя Fiddler, я отслеживал запрос, и все данные POST передаются правильно. Я пытаюсь определить, как / где данные могут быть искажены. Любая помощь будет принята с благодарностью.

Ответы [ 14 ]

0 голосов
/ 09 августа 2018

Вы также должны убедиться, что ваш фильтр кодирования (org.springframework.web.filter.CharacterEncodingFilter) в вашем файле web.xml сопоставлен перед многочастным фильтром (org.springframework.web.multipart.support.MultipartFilter).

0 голосов
/ 31 января 2018

У меня была такая же проблема. Единственное решение, которое работало для меня, это добавление в multipartResoler в файле конфигурации Spring.

0 голосов
/ 15 февраля 2009

Вы не используете UTF-8 для кодирования текстовых данных для HTML-форм. Стандарт html определяет две кодировки, и соответствующая часть этого стандарта здесь . «Старая» кодировка, чем обрабатывает ascii, является application / x-www-form-urlencoded. Новый, который работает правильно, является multipart / form-data.

В частности, объявление формы выглядит так:

 <FORM action="http://server.com/cgi/handle"
       enctype="multipart/form-data"
       method="post">
   <P>
   What is your name? <INPUT type="text" name="submit-name"><BR>
   What files are you sending? <INPUT type="file" name="files"><BR>
   <INPUT type="submit" value="Send"> <INPUT type="reset">
 </FORM>

И я думаю, что это все, о чем вам нужно беспокоиться - веб-сервер должен справиться с этим. Если вы пишете что-то, что непосредственно считывает InputStream из веб-клиента, вам нужно будет прочитать RFC 2045 и RFC 2046 .

0 голосов
/ 15 февраля 2009

Фильтр и настройка Tomcat для поддержки URI UTF-8 важны только в том случае, если вы передаете через строку запроса URL-адреса, как если бы вы использовали HTTP GET. Если вы используете POST со строкой запроса в теле HTTP-сообщения, важен тип содержимого запроса, и браузер должен установить тип содержимого в UTF-8 и отправить содержимое с этой кодировкой.

Единственный способ действительно сделать это - сообщить браузеру, что вы можете принимать только UTF-8, установив заголовок Accept-Charset для каждого ответа на «UTF-8; q = 1, ISO-8859-1; q = 0,6" . В результате UTF-8 будет считаться лучшим качеством, а кодировка по умолчанию, ISO-8859-1 - приемлемым, но с более низким качеством.

Когда вы говорите, что имя файла искажено, оно искажено в возвращаемом значении HttpServletRequest.getParameter?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...