SPRING MVC上传的中文乱码问题

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


}

 

 

猜你喜欢

转载自json20080301.iteye.com/blog/1905479