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

Struts2 文件下載檔名亂碼:OGNL 表達式動態獲取 fileName

     編輯:程式設計綜合問答

問題

下載時檔名顯示為 `Down.txt` 或 `down.action`,而非原始中文檔名。

原因

`struts.xml` 中 `attachment;filename="${filename}"` 的 `${filename}` **未被 OGNL 解析**,或 Action 的 `getFileName()` 返回值編碼錯誤。

修正步驟

  1. Action 確保 `getFileName()` 返回 UTF-8 編碼的檔名 (不需手動 ISO-8859-1 轉碼):
    
       public String getFileName() {
           return fileName; // 已在 setFileName() 中正確解碼
       }
       
  2. `struts.xml` 使用雙引號包裹 OGNL 表達式,確保 Struts 2.3.20+ 版本解析:
    
       
           attachment;filename="${fileName}"
           downloadFile
       
       
  3. 若仍亂碼,檢查 `struts.xml` 開頭宣告:
    
       
           
           
       
       
  4. JSP 產生下載連結時,檔名需 `URLEncoder.encode` (UTF-8):
    
       String fname = java.net.URLEncoder.encode(file.getName(), "UTF-8");
       out.println("" + file.getName() + "");
       

關鍵點

  • Action `setFileName()` 接收請求參數 `name` 時,**必須** `new String(param.getBytes("ISO-8859-1"), "UTF-8")` 解碼 (Tomcat 8+ 預設 UTF-8 可略過)。
  • `contentDisposition` 參數值中的 `${fileName}` **區分大小寫**,需與 Action `getFileName()` 方法名對應 (`fileName` ↔ `getFileName`)。
  • Stream Result 類型會自動設定 `Content-Disposition` 標頭,瀏覽器依此顯示「另存為」檔名。

總結:Action 正確解碼 → struts.xml OGNL 正確引用 → JSP 連結 URLEncoder 編碼 三步到位。

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