java - para - El texto de UTF-8 se confunde cuando el formulario se publica como multipart/form-data
oracle jdk 10 (11)
Estoy cargando un archivo al servidor. El formulario HTML de carga de archivos tiene 2 campos:
- Nombre de archivo: un cuadro de texto HTML donde el usuario puede dar un nombre en cualquier idioma.
- Carga de archivos: un ''archivo'' HTMl donde el usuario puede especificar un archivo del disco para cargar.
Cuando se envía el formulario, el contenido del archivo se recibe correctamente. Sin embargo, cuando se lee el nombre del archivo (punto 1 anterior), se confunde. Los caracteres ASCII se muestran correctamente. Cuando el nombre se da en algún otro idioma (alemán, francés, etc.), hay problemas.
En el método de servlet, la codificación de caracteres de la solicitud se establece en UTF-8. Incluso intenté hacer un filtro como se menciona: - pero parece que no funciona. Solo el nombre del archivo parece estar distorsionado.
La tabla MySQL donde el nombre del archivo es compatible con UTF-8. Di caracteres aleatorios no ingleses y se almacenan / muestran correctamente.
Usando Fiddler, supervisé la solicitud y todos los datos POST se pasaron correctamente. Intento identificar cómo / dónde podrían confundirse los datos. Cualquier ayuda será apreciada.
El filtro es clave para IE. Algunas otras cosas para verificar;
¿Cuál es la codificación de la página y el conjunto de caracteres? Ambos deben ser UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
¿Cuál es el conjunto de caracteres en la metaetiqueta?
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
¿Su cadena de conexión MySQL especifica UTF-8? p.ej
jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8
En caso de que alguien descubriera este problema al trabajar en la aplicación web Grails (o primavera pura), aquí está la publicación que me ayudó:
http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms
Para establecer la codificación predeterminada en UTF-8 (en lugar de ISO-8859-1) para solicitudes de varias partes, agregué el siguiente código en resources.groovy (Spring DSL):
multipartResolver(ContentLengthAwareCommonsMultipartResolver) {
defaultEncoding = ''UTF-8''
}
Estoy usando org.apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory)
y org.apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory)
definiendo la codificación al leer el valor del parámetro:
List<FileItem> 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
Estoy usando Primefaces con glassfish y SQL Server.
en mi caso, creé el Webfilter, en back-end, para obtener cada solicitud y convertirla a UTF-8, así:
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
}
}
En la Vista (.xhtml) necesito establecer el formulario del paremeter enctype en UTF-8 como @Kevin Rahe:
<h:form id="frmt" enctype="multipart/form-data;charset=UTF-8" >
<!-- your code here -->
</h:form>
La función de filtro y la configuración de Tomcat para admitir URI UTF-8 solo son importantes si pasa el valor a través de la cadena de consulta de la URL, como lo haría con HTTP GET. Si está utilizando un POST, con una cadena de consulta en el cuerpo del mensaje HTTP, lo importante será el tipo de contenido de la solicitud, y esto dependerá del navegador para configurar el tipo de contenido en UTF-8 y envía el contenido con esa codificación.
La única forma de hacerlo es decirle al navegador que solo puede aceptar UTF-8 configurando el encabezado Accept-Charset en cada respuesta a "UTF-8; q = 1, ISO-8859-1; q = 0.6" . Esto colocará UTF-8 como la mejor calidad y el juego de caracteres predeterminado, ISO-8859-1, como aceptable, pero de menor calidad.
Cuando dices que el nombre del archivo está distorsionado, ¿está distorsionado en el valor de retorno de HttpServletRequest.getParameter?
Me quedé atascado con este problema y descubrí que era el orden de la llamada a
request.setCharacterEncoding("UTF-8");
eso estaba causando el problema Tiene que ser llamado antes de cualquier llamada a request.getParameter (), así que hice un filtro especial para usar en la parte superior de mi cadena de filtros.
http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored
No usa UTF-8 para codificar datos de texto para formularios HTML. El estándar html define dos codificaciones, y la parte relevante de ese estándar está aquí . La codificación "antigua", que maneja ascii, es application / x-www-form-urlencoded. El nuevo, que funciona correctamente, es multipart / form-data.
Específicamente, la declaración de formulario se ve así:
<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>
Y creo que eso es todo de lo que tienes que preocuparte: el servidor web debería manejarlo. Si está escribiendo algo que lea directamente el InputStream desde el cliente web, necesitará leer RFC 2045 y RFC 2046 .
Solo use la biblioteca de carga de Apache commons. Agregue URIEncoding="UTF-8"
al conector de Tomcat, y use FileItem.getString ("UTF-8") en lugar de FileItem.getString () sin charset especificado.
Espero que esto ayude.
Tuve el mismo problema al usar Apache commons-fileupload. No descubrí qué causa los problemas, especialmente porque tengo la codificación UTF-8 en los siguientes lugares: 1. Metaetiqueta HTML 2. Aceptación de caracteres de formulario de atributo 3. Filtro Tomcat en cada solicitud que establece el "UTF-8" codificación
-> Mi solución fue convertir especialmente cadenas de ISO-8859-1 (o lo que sea la codificación predeterminada de su plataforma) a UTF-8:
new String (s.getBytes ("iso-8859-1"), "UTF-8");
Espero que ayude
Edición: comenzando con Java 8 también puede usar lo siguiente:
new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
Tuve el mismo problema y resultó que además de especificar la codificación en el filtro
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
es necesario agregar "acceptcharset" a la forma
<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" >
y ejecuta la JVM con
-Dfile.encoding=UTF-8
La metaetiqueta HTML no es necesaria si la envía en el encabezado HTTP utilizando response.setCharacterEncoding ().
Yo tuve el mismo problema. La única solución que funcionó para mí fue agregar <property = "defaultEncoding" value = "UTF-8"> a multipartResoler en el archivo de configuraciones de primavera.