PrimeFaces 上传文件 中文乱码

      某度搜索出来的,关于PrimeFaces <p:fileUpload>上传文件中文乱码的问题,基本没解决得了,所以Google了一下,找到了解决办法;并整理了一下,内容如下( 此方法的好处就是不用编辑源文件):

一、PrimeFaces version:

              primefaces-3.2.jar


二、相关文档:

           http://code.google.com/p/primefaces/issues/detail?id=787

The following is Simplified Chinese.

当使用PrimeFaces的<p:fileUpload>上传文件并使用非拉丁字符(比如中文)时,服务器端接收的文件名会编码混乱(即中文乱码),表单中其它输入的文本也会编码混乱(即中文乱码)。
这是一个编码问题。

相关论坛主题连接:
http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=1963
http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6513

另请参阅《解决Commons FileUpload的中文乱码问题》:http://blog.csdn.net/luhao/archive/2007/07/16/1693641.aspx

我在论坛里登记了,但我无法接收到激活邮件。
因此,我无法登录进论坛,也无法在论坛里添加评论 :-(

我找到修复这个问题的解决办法了,仅用3步:

步骤1. 修复 primefaces-read-only\src\main\java\org\primefaces\webapp\filter\FileUploadFilter.java

Index: FileUploadFilter.java
===================================================================
--- FileUploadFilter.java	(版本 4615)
+++ FileUploadFilter.java	(工作副本)
@@ -69,6 +69,10 @@
 			}

 			ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
+                        String encoding = request.getCharacterEncoding();
+                        if (encoding != null) {
+                            servletFileUpload.setHeaderEncoding(encoding);
+                        }
 			MultipartRequest multipartRequest = new MultipartRequest(httpServletRequest, servletFileUpload);

 			if(logger.isLoggable(Level.FINE))

步骤2. 修复 primefaces-read-only\src\main\java\org\primefaces\webapp\MultipartRequest.java

Index: MultipartRequest.java
===================================================================
--- MultipartRequest.java	(版本 4615)
+++ MultipartRequest.java	(工作副本)
@@ -16,6 +16,7 @@
 package org.primefaces.webapp;

 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -24,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.Level;
 import java.util.logging.Logger;

 import javax.servlet.http.HttpServletRequest;
@@ -81,11 +83,23 @@
 	}

 	private void addFormParam(FileItem item) {
-		if(formParams.containsKey(item.getFieldName())) {
-			formParams.get(item.getFieldName()).add(item.getString());
+		String str = null;
+		String charset = this.getRequest().getCharacterEncoding();
+		if (charset == null) {
+			str = item.getString();
 		} else {
+			try {
+				str = item.getString(charset);
+			} catch (UnsupportedEncodingException ex) {
+				str = item.getString();
+				Logger.getLogger(MultipartRequest.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		if (formParams.containsKey(item.getFieldName())) {
+			formParams.get(item.getFieldName()).add(str);
+		} else {
 			List<String> items = new ArrayList<String>();
-			items.add(item.getString());
+			items.add(str);
 			formParams.put(item.getFieldName(), items);
 		}
 	}

步骤3. 修复 primefaces-examples\showcase\src\main\webapp\WEB-INF\web.xml (CharacterEncodingFilter应该放在FileUploadFilter的前面)

Index: web.xml
===================================================================
--- web.xml	(版本 4615)
+++ web.xml	(工作副本)
@@ -37,20 +37,20 @@
     -->

     <filter>
-        <filter-name>PrimeFaces FileUpload Filter</filter-name>
-        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
+        <filter-name>Character Encoding Filter</filter-name>
+        <filter-class>org.primefaces.examples.filter.CharacterEncodingFilter</filter-class>
     </filter>
     <filter-mapping>
-        <filter-name>PrimeFaces FileUpload Filter</filter-name>
+        <filter-name>Character Encoding Filter</filter-name>
         <servlet-name>Faces Servlet</servlet-name>
     </filter-mapping>

     <filter>
-        <filter-name>Character Encoding Filter</filter-name>
-        <filter-class>org.primefaces.examples.filter.CharacterEncodingFilter</filter-class>
+        <filter-name>PrimeFaces FileUpload Filter</filter-name>
+        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
     </filter>
     <filter-mapping>
-        <filter-name>Character Encoding Filter</filter-name>
+        <filter-name>PrimeFaces FileUpload Filter</filter-name>
         <servlet-name>Faces Servlet</servlet-name>
     </filter-mapping>

三、根据上面的内容,在项目中新建同名文件:


四、在web.xml加入如下内容:

<filter>
        <filter-name>Character Encoding Filter</filter-name>
        <filter-class>cn.ems.budget.global.CharacterEncodingFilter</filter-class>
     </filter>
     <filter-mapping>
        <filter-name>Character Encoding Filter</filter-name>
         <servlet-name>Faces Servlet</servlet-name>
     </filter-mapping>

     <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        <init-param>
			<param-name>thresholdSize</param-name>
			<param-value>10000000</param-value>
		</init-param>
     </filter>
     <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
         <servlet-name>Faces Servlet</servlet-name>
     </filter-mapping>

五、CharacterEncodingFilter文件:

package cn.ems.budget.global;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter{
	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		System.out.println("getCharacterEncoding:"+request.getCharacterEncoding());
		response.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);

	}

	public void init(FilterConfig filterConfig) throws ServletException {

	}
}


六、效果:



猜你喜欢

转载自blog.csdn.net/ptianfeng/article/details/9351845
今日推荐