許多開發者對 263 信箱中的「上傳附件」功能印象深刻:點擊「瀏覽」選取檔案後,按下確定即可將檔案上傳至伺服器。早期網路上雖有 SmartUpload 等現成元件,但使用起來往往不盡人意。本文將詳細記錄自行開發檔案上傳 Servlet 的完整過程,希望能為有相同需求的開發者提供參考。
若缺乏 Servlet 容器,可參考 JSP 伺服器比較矩陣 從 36 款產品中選擇安裝。所有 JSP 伺服器皆支援 Servlet,因 JSP 本質上會先編譯為 Servlet 再執行。
關鍵在於設定 enctype="multipart/form-data",因為此編碼格式的資料流結構與一般表單提交截然不同。
<form action="/java/servlet/powerise.nms.web.UploadFile" method="post" enctype="multipart/form-data">
<p>
<input type="radio" name="type" value="0"> model
<input type="radio" name="type" value="1"> report
<input name="id">
<input type="file" name="file" value="test">
</p>
<input type="submit">
</form>
完成頁面後,啟動監聽器並在瀏覽器(IE 或 Netscape)開啟頁面,選取任意檔案送出。跳過前幾個封包後,可捕獲到關鍵的 HTTP POST 封包。第一個封包包含 HTTP 標頭資訊,可透過 HttpServletRequest.getHeader() 取得,但無法用 getInputStream() 讀取。關於 HTTP 協定細節,可參考 W3C 標準。
封包中關鍵部分包含:
Content-Type: multipart/form-data; boundary=--------------------------7d1352a2016c:界定各欄位的邊界字串核心在於從 request.getInputStream() 讀取原始位元組流,依 boundary 切割欄位,再分別處理一般欄位與檔案內容。檔案部分需解析 Content-Disposition 標頭取得原始檔名,並將實體內容寫入伺服器磁碟。
透過手動解析 multipart/form-data 封包,不僅能深入理解 HTTP 檔案上傳機制,也能在無法引入第三方函式庫的環境下實現上傳功能。後續可延伸為通用的上傳工具類,支援多檔案、進度顯示、斷點續傳等進階特性。