天天看点

解决plupload-2.1.2,springmvc上传中文文件名乱码问题

方法1、在web.xml文件中加入配置:

<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
           

方法2、在springmvc配置文件中的上传文件配置

<bean id="multipartResolver"  
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    <property name="maxUploadSize" value="10485760"/>
    <property name="defaultEncoding" value="UTF-8"></property>
</bean>
           

加入<property name="defaultEncoding" value="UTF-8"></property>即可。

下面解读下为什么这样配置就可以解决乱码问题了,

看下CommonsMultipartResolver,CommonsFileUploadSupport类中关于编码的方法:

protected String determineEncoding(HttpServletRequest request) {
		String encoding = request.getCharacterEncoding();
		if (encoding == null) {
			encoding = getDefaultEncoding();
		}
		return encoding;
	}
           
protected String getDefaultEncoding() {
		String encoding = getFileUpload().getHeaderEncoding();
		if (encoding == null) {
			encoding = "ISO-8859-1";
		}
		return encoding;
	}
           
public void setDefaultEncoding(String defaultEncoding) {
  this.fileUpload.setHeaderEncoding(defaultEncoding);
 }
           
protected CommonsFileUploadSupport.MultipartParsingResult parseRequest(
			HttpServletRequest request) throws MultipartException {
		String encoding = determineEncoding(request);
		FileUpload fileUpload = prepareFileUpload(encoding);
		try {
			List 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);
		}
	}
           

通过以上代码可以看到,如果通过

String encoding = request.getCharacterEncoding();获取的编码为null,并且配置文件中的defaultEncoding属性没有配置的话,程序就会使用

“ISO-8859-1”对上传的文件进行处理,所以会出现中文乱码的情况。

在看下CharacterEncodingFilter这个类对编码的处理:

protected void doFilterInternal(HttpServletRequest request,
			HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		if ((this.encoding != null)
				&& (((this.forceEncoding) || (request.getCharacterEncoding() == null)))) {
			request.setCharacterEncoding(this.encoding);
			if (this.forceEncoding) {
				response.setCharacterEncoding(this.encoding);
			}
		}
		filterChain.doFilter(request, response);
	}
           

可以看到这个类就是对request和response进行编码设置。。

建议:程序中统一使用一种编码格式,这样可以有效的解决乱码问题带来的困扰