1. 程式人生 > >解決struts2 下載中文名稱亂碼問題 適應不同三大主流瀏覽器 chrome28.0.1500.95、 firefox 23.0.1 、 IE11

解決struts2 下載中文名稱亂碼問題 適應不同三大主流瀏覽器 chrome28.0.1500.95、 firefox 23.0.1 、 IE11



最近使用Sturts2作檔案下載時,發現在不同的瀏覽器上會有中文檔名亂碼的問題,現在把解決方法放在這裡,以便留個備份。

struts2配置檔案如下:

Xml程式碼 複製程式碼 收藏程式碼
  1. <actionname="fileDownLoad"class="com.test.FileDownloadAction">
  2.             <resultname="download"type="stream">
  3.                 <paramname="contentType">application/pdf;charset=UTF-8</param>
  4.                 <paramname="contentDisposition">attachment;filename="${filename}.pdf"</param>
  5.                 <paramname="inputName">inputStream</param>
  6.                 <paramname="bufferSize">4096</param>
  7.             </result>
  8.         </action>
<action name="fileDownLoad" class="com.test.FileDownloadAction">
			<result name="download" type="stream">
				<param name="contentType">application/pdf;charset=UTF-8</param>
				<param name="contentDisposition">attachment;filename="${filename}.pdf"</param>
				<param name="inputName">inputStream</param>
				<param name="bufferSize">4096</param>
			</result>
		</action>

 FileDownloadAction.java的檔名處理的 程式碼如下(其他程式碼忽略):

Java程式碼 複製程式碼 收藏程式碼
  1. /** 
  2.      * 下載檔名編碼,對於不同的瀏覽器使用不同的編碼格式 
  3.      *  
  4.      * @param request  
  5.      * @param name 
  6.      */
  7.     private String processFileName(HttpServletRequest request, String name)  
  8.             throws UnsupportedEncodingException {  
  9.         String filename = null
    ;  
  10.         String agent = request.getHeader("USER-AGENT");  
  11.         if (null != agent){  
  12.             if (-1 != agent.indexOf("Firefox")) {//Firefox
  13.                 filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(name.getBytes("UTF-8"))))+ "?=";  
  14.             }elseif (-1 != agent.indexOf("Chrome")) {//Chrome
  15.                 filename = new String(name.getBytes(), "ISO8859-1");  
  16.             } else {//IE7+
  17.                 filename = java.net.URLEncoder.encode(name, "UTF-8");  
  18.                 filename = StringUtils.replace(filename, "+""%20");//替換空格
  19.             }  
  20.         } else {  
  21.             filename = name;  
  22.         }  
  23.         return filename;  
  24.     }  
/**
	 * 下載檔名編碼,對於不同的瀏覽器使用不同的編碼格式
	 * 
	 * @param request 
	 * @param name
	 */
	private String processFileName(HttpServletRequest request, String name)
			throws UnsupportedEncodingException {
		String filename = null;
		String agent = request.getHeader("USER-AGENT");
		if (null != agent){
			if (-1 != agent.indexOf("Firefox")) {//Firefox
				filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(name.getBytes("UTF-8"))))+ "?=";
			}else if (-1 != agent.indexOf("Chrome")) {//Chrome
				filename = new String(name.getBytes(), "ISO8859-1");
			} else {//IE7+
				filename = java.net.URLEncoder.encode(name, "UTF-8");
				filename = StringUtils.replace(filename, "+", "%20");//替換空格
			}
		} else {
			filename = name;
		}

		return filename;
	}

網上很多說直接使用"ISO8859-1"編碼格式的問題,經過驗證並不能很好的解決問題,還是需要對於不同的瀏覽器使用不同的編碼格式,瀏覽器相容性的問題真心糾結。。。

注:這裡只選取了三種主流瀏覽器(ie7+,firefox8.0,chrome18.0),其他瀏覽器未作測試。