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 {

	}
}


六、效果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章