spring-mvc-showcase中有关于文件上传的代码,但代码都是基于英文编写,对于中文的乱码问题却没有提及,这个让中国的IT民工相当郁闷;把我也郁闷了一阵,仔细地看了看他的源码;问题得到了解决;先直接给出解决方案,后面再对照源码看他是如何处理编码问题的。
1.首先对所有request设置强制编码:(WEB.XML)
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.在JSP页面进行页面编码:(spring-mvc-showcase-master/src/main/webapp/WEB-INF/views/fileupload.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
或者 <form action="form_action.asp" accept-charset="UTF-8">
只需要这两条就可以解决乱码问题,如果是GBK,把对应的位置更换成GBK即可;
=============================================================================
文件上传时编码优先级别如下:
//fileItem.getContentType() 第一优先级
request.getCharacterEncoding() 第二优先级 (可以通过过滤器设置)
> FileUpload().getHeaderEncoding 第三优先级 (通过配置CommonsMultipartResolver 的setDefaultEncoding() )配置代码如下:
<beans:property name="defaultEncoding" value="UTF-8" />
> WebUtils.DEFAULT_CHARACTER_ENCODING 第四优先级 (如果上面都没有配置那么就是ISO-8859-1)
//表单元素的编码规则:fileItem.getContentType() > determineEncoding(request) = request.getCharacterEncoding()> FileUpload().getHeaderEncoding > WebUtils.DEFAULT_CHARACTER_ENCODING
public class MyMultipartResolver extends CommonsMultipartResolver {
private static final Log log = LogFactory.getLog(MyMultipartResolver.class);
//fileItem.getContentType() >request.getCharacterEncoding()> FileUpload().getHeaderEncoding > WebUtils.DEFAULT_CHARACTER_ENCODING
//表单元素的编码规则:fileItem.getContentType() > determineEncoding(request) = request.getCharacterEncoding()> FileUpload().getHeaderEncoding > WebUtils.DEFAULT_CHARACTER_ENCODING
@Override
protected String determineEncoding(HttpServletRequest request) {
String encoding = request.getCharacterEncoding();
log.debug(" request.getCharacterEncoding --->" + encoding );
if (encoding == null) {
encoding = getDefaultEncoding();
log.debug(" getDefaultEncoding --->" + encoding );
}
return encoding ;
}
// CUSTOM Encoding
@Override
protected String getDefaultEncoding() {
String encoding = getFileUpload().getHeaderEncoding();
log.debug(" getFileUpload().getHeaderEncoding --->" + encoding );
if (encoding == null) {
encoding = WebUtils.DEFAULT_CHARACTER_ENCODING;
log.debug(" WebUtils.DEFAULT_CHARACTER_ENCODING --->" + encoding );
}
return encoding;
}
@SuppressWarnings("unchecked")
protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
String encoding = determineEncoding(request);
log.debug(" determineEncoding --->" + encoding );
FileUpload fileUpload = prepareFileUpload(encoding);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
}
catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
}
catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
}
protected FileUpload prepareFileUpload(String encoding) {
FileUpload fileUpload = getFileUpload();
FileUpload actualFileUpload = fileUpload;
// Use new temporary FileUpload instance if the request specifies
// its own encoding that does not match the default encoding.
if (encoding != null && !encoding.equals(fileUpload.getHeaderEncoding())) {
actualFileUpload = newFileUpload(getFileItemFactory());
actualFileUpload.setSizeMax(fileUpload.getSizeMax());
actualFileUpload.setHeaderEncoding(encoding);
}
log.debug(" actualFileUpload HeaderEncoding--->" + actualFileUpload.getHeaderEncoding() );
return actualFileUpload;
}
}
本文介绍了解决Spring MVC环境下文件上传时中文名称乱码的问题。通过设置请求编码、使用CharacterEncodingFilter及配置CommonsMultipartResolver来确保中文文件名正确解析。
9991

被折叠的 条评论
为什么被折叠?



