首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 文件下載中文亂碼完整解決方案:Tomcat、Action、JSP 三層編碼統一

     編輯:程式設計綜合問答

問題現象

Struts2 stream 結果類型下載文件時,文件名中文亂碼、內容亂碼。Action 代碼:

public InputStream getInputStream() throws Exception {
    this.fileName = d.getDatumname();
    ServletActionContext.getResponse().setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(fileName, "utf-8"));
    return ServletActionContext.getServletContext().getResourceAsStream("upload//" + fileName);
}

struts.xml 配置:

<result name="success" type="stream">
    <param name="contentType">application/octet-stream;charset=iso8859-1</param>
    <param name="inputName">inputStream</param>
    <param name="bufferSize">4096</param>
    <param name="contentDisposition">attachment;filename="${fileName}"</param>
</result>

三層編碼統一策略

  1. Tomcat 服務器層:修改 conf/server.xml,Connector 添加 URIEncoding="UTF-8",保證 URL 參數解碼正確。
    <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" ... />
    
  2. Action 請求/響應層:顯式設置字符編碼,覆蓋默認 ISO-8859-1。
    ServletActionContext.getRequest().setCharacterEncoding("UTF-8");
    ServletActionContext.getResponse().setCharacterEncoding("UTF-8");
    
  3. JSP 前端層:超鏈接參數雙重編碼,防止瀏覽器默認編碼差異。
    var fileName = "中文文件.pdf";
    fileName = encodeURIComponent(encodeURIComponent(fileName)); // 雙重編碼
    window.location.href = "download.action?fileName=" + fileName;
    

Struts2 配置優化

  • contentType 設置為 application/octet-stream;charset=UTF-8。
  • contentDisposition 使用 filename*=UTF-8''${encodedFileName} (RFC 5987) 現代瀏覽器兼容更好,需在 Action 中預編碼 encodedFileName。
  • 確保 fileName getter 返回已編碼字符串,或由 Struts2 自動調用 URLEncoder(需配置 struts.i18n.encoding=UTF-8)。

文件內容亂碼排查

若文件內容亦亂碼,檢查:

  1. 文件讀取流是否指定編碼(二進制文件無需編碼,文本文件需 InputStreamReader(stream, "UTF-8"))。
  2. 上傳時文件編碼是否已損壞(上傳組件 cos.jar/commons-fileupload 需設置 setHeaderEncoding("UTF-8"))。

系統性統一三層編碼,可徹底解決 Struts2 文件下載中文亂碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved