JSP 頁面 `contentType="UTF-8"`,Eclipse 專案編碼為 GBK,Windows 系統預設 GBK。上傳檔案時,表單欄位 `filename` 中文顯示為 `????`。
請求參數解碼編碼與實際傳輸編碼不一致。Tomcat 預設以 ISO-8859-1 解碼 GET/POST 參數,若未設定 `URIEncoding="UTF-8"` 且前端未統一編碼,中文會亂碼。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
<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>
// 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 {
// 處理檔案流
}
}
右鍵專案 → Properties → Resource → Text file encoding → Other: UTF-8。將 GBK 改為 UTF-8,避免原始碼中文常量編碼不一致。
百度知道詳細解答:JSP 上傳中文亂碼解決
「全鏈路 UTF-8」是解決中文亂碼的鐵律:瀏覽器表單 → Tomcat Connector → JSP pageEncoding → FileUpload headerEncoding → Java 字串解碼。任一環節缺失皆會導致亂碼。