Servlet 3.0 規範內建文件上傳支持,需 Tomcat 7+ 容器。若在低版本 Tomcat 強行引入 servlet-api-3.0.jar 易發生類衝突,建議直接升級容器版本。
@WebServlet(name = "uploadServlet", urlPatterns = "/uploadServlet")
@MultipartConfig // 關鍵:聲明該 Servlet 處理 multipart/form-data 請求
public class ServletUpload extends HttpServlet {
private static final long serialVersionUID = 2527441790014487640L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 1. 獲取所有 Part(文件+普通字段)
Collection<Part> parts = request.getParts();
if (parts == null || parts.isEmpty()) {
throw new ServletException("上傳內容為空");
}
// 2. 遍歷處理
for (Part part : parts) {
String header = part.getHeader("content-disposition");
String fileName = getFileName(header); // 解析原始文件名
// 3. 寫入磁盤(此處示例寫死 D盤,生產環境應配置化)
part.write("d:/" + fileName);
}
response.getWriter().write("上傳成功");
} catch (Exception e) {
e.printStackTrace();
response.getWriter().write("上傳失敗: " + e.getMessage());
}
}
/** 從 content-disposition header 解析文件名,並生成 UUID 防重名 */
private String getFileName(String header) {
// header 形式: form-data; name="file"; filename="xxx.jpg"
String suffix = header.substring(header.lastIndexOf("."), header.length() - 1);
String uuid = UUID.randomUUID().toString().replace("-", "");
return uuid + suffix;
}
}
| 屬性 | 類型 | 默認值 | 說明 |
|---|---|---|---|
| fileSizeThreshold | int | 0 | 當上傳文件大小超過此閾值(字節),內容從內存寫入臨時文件 |
| location | String | "" | 臨時文件存儲目錄(不配置則用容器默認臨時目錄) |
| maxFileSize | long | -1 | 單個文件最大允許大小,-1 表示無限制 |
| maxRequestSize | long | -1 | 整個 multipart 請求最大大小(含所有文件+表單字段),-1 無限制 |
<form action="uploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" multiple="multiple" />
<button type="submit">上傳</button>
</form>
method="post":GET 請求無請求體,無法上傳文件。enctype="multipart/form-data":必須設置,否則請求體不會被解析為 Part。name 屬性:每個上傳控件必須有 name,Servlet 才能識別。multiple:HTML5 屬性,支持多文件同時選擇。location,區分開發/測試/生產環境。Servlet 3.0 原生上傳 API 通過 @MultipartConfig + request.getParts() 實現了「零第三方依賴、代碼極簡、容器原生支持」的輕量級文件上傳,適合中小項目、微服務組件、快速原型開發。大型系統建議封裝通用上傳組件,集成雲存儲(OSS/S3)、CDN 分發、圖片處理等能力。