java - test - Problema de codificación de nombre de archivo cargado para japonés y chino
noticias de japon en vivo (1)
Actualmente estoy usando jQuery-File-Upload . Puedo cargar algunos archivos con un nombre de archivo japonés o chino, y puedo ver que el nombre del archivo es, por ejemplo, "お 疲 れ txt す す .txt" o "测试 txt .txt" en el modo de depuración del navegador, pero en el backend (Java) , se convierten en "ã Šç-²ã,Œæ§~㠧㠙 .txt" y "æμ <è¯ • æ- ‡ t £ .txt".
Una vez intenté configurar formAcceptCharset en UTF-8 pero no funciona.
Pregunta:
¿Cómo obtener el nombre correcto de archivo en el lado de Java al analizar MultipartFormData?
Gracias por adelantado.
Por cierto, la siguiente es mi información
-----------------------------25382434931419
Content-Disposition: form-data; name="file"; filename="�疲れ様��.txt"
Content-Type: text/plain
....
Agregue los códigos Java
De hecho, no hice nada en el lado de Java actualmente,
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(InMultiPart inMP) {
while (inMP.hasNext()) {
InPart part = inMP.next();
MultivaluedMap<String, String> headers = part.getHeaders();
String fileName = null;
if (!headers.containsKey("Content-Disposition")) {
continue;
} else {
// get the file name here
fileName = parseFileName(headers.getFirst("Content-Disposition"));
}
//.....
}
//......
}
private String parseFileName(String disposition) {
int fileNameIndex = disposition.indexOf("filename=");
if (fileNameIndex < 0) {
return null;
}
int start = disposition.indexOf("/"", fileNameIndex) + 1;
int end = disposition.indexOf("/"", start);
return disposition.substring(start, end);
}
Como dijo Stephen C, un filtro puede usarse para obtener la codificación correcta. Tuvimos este problema en JBOSS 7.1.1 e implementamos un filtro.
En web xml
<filter>
<display-name>set character encoding</display-name>
<filter-name>RequestEncodingFilter</filter-name>
<filter-class>com.myapp.RequestEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Clase de filtro:
public class RequestEncodingFilter implements Filter {
private static final String ENCODING = "encoding";
private String configuredEncoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
configuredEncoding = filterConfig.getInitParameter(ENCODING);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(configuredEncoding);
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}