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; } }