某度搜索出來的,關於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 {
}
}
六、效果: