上传的日文和中文文件名编码问题 [英] Uploaded filename encoding issue for Japanese and Chinese
问题描述
我目前正在使用 jQuery-File-Upload 。我可以上传一些带有日文或中文文件名的文件,我可以看到文件名是例如在浏览器调试模式下的お疲れ様です.txt或测试文档.txt,但是在后端(Java) ,它们变成ã Šç-²ã,,æ§~㠧㠙.txt和æμ<试æ-‡æ¡£.txt。
我曾经试过将 formAcceptCharset 设置为 UTF-8 ,但不起作用。
问题:
如何获取正确的文件名Java端解析MultipartFormData?
预先感谢。
BTW,以下是我的资料
----------------------------- 25382434931419
内容-Disposition:form-data; name =file; filename =ã?Šç-²ã,,æ§~ã?§ã?™.txt
Content-Type:text / plain
....
添加Java代码
事实上, Java侧目前,@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String上传(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 {
//获取文件名
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);
}
解决方案可以用来获得正确的编码。我们在JBOSS 7.1.1上遇到了这个问题,并实现了一个过滤器。
在web xml
< filter&
< display-name>设置字符编码< / 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>
筛选器类别:
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(){
}
}
I am currently using the jQuery-File-Upload. I may upload some files with a Japanese or Chinese file name, and I can see that the file name is for example, "お疲れ様です.txt" or "测试文档.txt" in browser's debug mode, but in the backend(Java), they become "ã�Šç–²ã‚Œæ§˜ã�§ã�™.txt" and "测试文档.txt".
I once tried to set formAcceptCharset to UTF-8 but it does not work.
Question:
How to get the correct file name in Java side when parsing the MultipartFormData?Thanks in advance.
BTW, The following is my data
-----------------------------25382434931419 Content-Disposition: form-data; name="file"; filename="�疲れ様��.txt" Content-Type: text/plain ....
Add the Java codes
In fact I did nothing in Java side currently,@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); }
解决方案As Stephen C said a filter can be used to get the right encoding. We had this problem on JBOSS 7.1.1 and implemented a filter.
In 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>
Filter class:
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() { }
}
这篇关于上传的日文和中文文件名编码问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!