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

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

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

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

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

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

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

У меня была та же проблема, с помощью Apache commons-fileupload. Я не выяснил, что вызывает проблемы, особенно потому, что у меня есть кодировка UTF-8 в следующих местах: 1. Метатег HTML 2. Атрибут accept-charset формы 3. Фильтр Tomcat для каждого запроса, который устанавливает «UTF-8», кодирование

-> Мое решение состояло в том, чтобы специально преобразовать строки из ISO-8859-1 (или что-то другое по умолчанию для вашей платформы) в UTF-8:

 new String (s.getBytes ("iso-8859-1"), "UTF-8"); 

надеюсь, это поможет

Изменить: начиная с Java 8 вы также можете использовать следующее:

 new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); 

Просто используйте библиотеку загрузки сообщества Apache. Добавьте URIEncoding="UTF-8" к коннектору Tomcat и используйте FileItem.getString (“UTF-8”) вместо FileItem.getString () без указанной кодировки.

Надеюсь, эта помощь.

Я застрял в этой проблеме и обнаружил, что это был призыв к

 request.setCharacterEncoding("UTF-8"); 

что вызывало проблему. Он должен быть вызван перед любым вызовом request.getParameter (), поэтому я сделал специальный фильтр для использования в верхней части моей цепочки фильтров.

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored

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

 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); 

необходимо добавить «acceptcharset» к форме

 

и запустить JVM с помощью

 -Dfile.encoding=UTF-8 

Метатег HTML не нужен, если вы отправляете его в HTTP-заголовке, используя response.setCharacterEncoding ().

В случае, если кто-то наткнулся на эту проблему при работе над веб-приложением Grails (или чистой весной), вот сообщение, которое помогло мне:

http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms

Чтобы установить кодировку по умолчанию для UTF-8 (вместо ISO-8859-1) для многопроцессорных запросов, я добавил следующий код в resources.groovy (Spring DSL):

 multipartResolver(ContentLengthAwareCommonsMultipartResolver) { defaultEncoding = 'UTF-8' } 

Фильтр является ключевым для IE. Еще несколько вещей, чтобы проверить;

Что такое кодировка страницы и набор символов? Оба должны быть UTF-8

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

Каков набор символов в метатеге?

  

Указывает ли ваша строка подключения MySQL на UTF-8? например

 jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8 

Я использую org.apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory) и определяя кодировку при чтении значения параметра:

 List items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for (FileItem item : items) { String fieldName = item.getFieldName(); if (item.isFormField()) { String fieldValue = item.getString("UTF-8"); // <-- HERE 

Я использую Primefaces со стекловатой и SQL Server.

в моем случае я создал Webfilter, в фоновом режиме, чтобы получить каждый запрос и преобразовать в UTF-8, например:

 package br.com.teste.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter(servletNames={"Faces Servlet"}) public class Filter implements javax.servlet.Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } } 

В представлении (.xhtml) мне нужно установить форму paremeter enctype в UTF-8, как @Kevin Rahe:

     

Объект фильтра и настройка Tomcat для поддержки URI UTF-8 важны только в том случае, если вы передаете строку запроса по URL, как и в случае с GET HTTP. Если вы используете 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?

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

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

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

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

  

What is your name?
What files are you sending?

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

  • Не удалось вычислить план сборки: плагин org.apache.maven.plugins: maven-resources-plugin: 2.5 или одна из его зависимостей не может быть решена
  • Что такое локальный / удаленный и не-интерфейс в EJB?
  • Когда использовать EntityManager.find () vs EntityManager.getReference () с JPA
  • Коллекция карт JPA из Enums
  • Как ссылаться на управляемые bean-компоненты JSF, которые предоставляются в JAR-файле?
  • Можно ли начать новый stream в управляемом компоненте JSF?
  • Поиск URL вашего приложения только с помощью ServletContext
  • PowerMockito макет одиночного статического метода и возвращаемого объекта
  • Есть ли способ запустить метод / class только при запуске Tomcat / Wildfly / Glassfish?
  • Зависимость от Maven для API Servlet 3.0?
  • Должен ли я использовать @EJB или @Inject
  • Давайте будем гением компьютера.