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

Struts2 下載中文檔名變 .action?檔名編碼處理指南

     編輯:程式設計綜合問答

現象

Struts2 stream 結果類型下載檔案,中文檔名在瀏覽器顯示為 xxx.action 或亂碼。

原因

HTTP Header Content-Disposition: attachment; filename="中文" 需 RFC 5987 編碼,否則瀏覽器回退解析導致截斷或誤判副檔名。

Struts2 官方解決方案

1. struts.xml 設定 encoding

<result name="success" type="stream">
    <param name="contentType">application/octet-stream</param>
    <param name="inputName">inputStream</param>
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
    <param name="bufferSize">4096</param>
    <param name="allowCaching">false</param>
</result>

2. Action 中提供 UTF-8 編碼後的檔名

public class DownloadAction extends ActionSupport {
    private String downloadFileName; // getter/setter
    private InputStream inputStream; // getter

    public String execute() {
        String originalName = "報表.xlsx";
        try {
            // RFC 5987: filename*=UTF-8''encoded
            downloadFileName = java.net.URLEncoder.encode(originalName, "UTF-8")
                                    .replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            downloadFileName = "download.xlsx";
        }
        inputStream = ServletActionContext.getServletContext()
                          .getResourceAsStream("/upload/" + originalName);
        return SUCCESS;
    }
}

各瀏覽器相容性補充

瀏覽器支援備註
Chrome/Firefox/Edge (新)filename*=UTF-8''標準支援
IE / 舊版 Safarifilename="URLEncoder"需雙重寫法

通用雙重寫法 (Action 中組裝 Header)

HttpServletResponse resp = ServletActionContext.getResponse();
String ua = req.getHeader("User-Agent");
String encoded = URLEncoder.encode(originalName, "UTF-8").replace("+", "%20");
String headerValue;
if (ua.contains("MSIE") || ua.contains("Trident")) {
    headerValue = "attachment; filename=\"" + encoded + "\"";
} else {
    headerValue = "attachment; filename*=UTF-8''" + encoded;
}
resp.setHeader("Content-Disposition", headerValue);

若在 Struts2 中,可自訂 HttpHeaderResult 或在 execute() 直接操作 response (需返回 null)。

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