解決struts2 下載中文名稱亂碼問題 適應不同三大主流瀏覽器 chrome28.0.1500.95、 firefox 23.0.1 、 IE11
阿新 • • 發佈:2019-01-10
最近使用Sturts2作檔案下載時,發現在不同的瀏覽器上會有中文檔名亂碼的問題,現在把解決方法放在這裡,以便留個備份。
struts2配置檔案如下:
Xml程式碼- <actionname="fileDownLoad"class="com.test.FileDownloadAction">
- <resultname="download"type="stream">
- <paramname="contentType">application/pdf;charset=UTF-8</param>
- <paramname="contentDisposition">attachment;filename="${filename}.pdf"</param>
- <paramname="inputName">inputStream</param>
- <paramname="bufferSize">4096</param>
- </result>
- </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程式碼- /**
- * 下載檔名編碼,對於不同的瀏覽器使用不同的編碼格式
- *
- * @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"))))+ "?=";
- }elseif (-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;
- }
/**
* 下載檔名編碼,對於不同的瀏覽器使用不同的編碼格式
*
* @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),其他瀏覽器未作測試。