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

JSP 文件上傳中文檔名亂碼解決:統一 UTF-8 編碼流程

     編輯:程式設計綜合問答

問題現象

JSP 頁面 `contentType="UTF-8"`,Eclipse 專案編碼為 GBK,Windows 系統預設 GBK。上傳檔案時,表單欄位 `filename` 中文顯示為 `????`。

根本原因

請求參數解碼編碼與實際傳輸編碼不一致。Tomcat 預設以 ISO-8859-1 解碼 GET/POST 參數,若未設定 `URIEncoding="UTF-8"` 且前端未統一編碼,中文會亂碼。

完整解決方案

1. Tomcat 設定 (server.xml)

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true" />

2. JSP 頁面頭部

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>

3. 上傳表單

<form action="upload.jsp" method="post" enctype="multipart/form-data"
      accept-charset="UTF-8">
    <input type="text" name="filename" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

4. 後端處理 (Cos/Commons FileUpload)

// Commons FileUpload 範例
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); // 關鍵:解析表單欄位時用 UTF-8

List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
    if (item.isFormField()) {
        String fieldName = item.getFieldName();
        String value = item.getString("UTF-8"); // 指定編碼取值
        if ("filename".equals(fieldName)) {
            // 取得中文檔名
        }
    } else {
        // 處理檔案流
    }
}

5. Eclipse 專案編碼統一

右鍵專案 → Properties → Resource → Text file encoding → Other: UTF-8。將 GBK 改為 UTF-8,避免原始碼中文常量編碼不一致。

驗證清單

  • 瀏覽器開發者工具 → Network → Request Headers → `Content-Type: multipart/form-data; boundary=...; charset=UTF-8`
  • 後端斷點檢查 `item.getString("UTF-8")` 是否正確顯示中文。

參考資源

百度知道詳細解答:JSP 上傳中文亂碼解決

總結

「全鏈路 UTF-8」是解決中文亂碼的鐵律:瀏覽器表單 → Tomcat Connector → JSP pageEncoding → FileUpload headerEncoding → Java 字串解碼。任一環節缺失皆會導致亂碼。

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