首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

使用 Java Servlet 實現檔案上傳功能完整指南

     編輯:Java 程式設計入門

前言

許多開發者對 263 信箱中的「上傳附件」功能印象深刻:點擊「瀏覽」選取檔案後,按下確定即可將檔案上傳至伺服器。早期網路上雖有 SmartUpload 等現成元件,但使用起來往往不盡人意。本文將詳細記錄自行開發檔案上傳 Servlet 的完整過程,希望能為有相同需求的開發者提供參考。

開發環境準備

必要工具

  • 封包分析工具:如 SpyNet(含 CaptureNet、PeepNet),用於分析 multipart/form-data 封包格式
  • Java 執行環境:至少包含 Servlet 容器與 JDK

若缺乏 Servlet 容器,可參考 JSP 伺服器比較矩陣 從 36 款產品中選擇安裝。所有 JSP 伺服器皆支援 Servlet,因 JSP 本質上會先編譯為 Servlet 再執行。

實作步驟

1. 建立上傳用 HTML 表單

關鍵在於設定 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>

2. 封包格式分析

完成頁面後,啟動監聽器並在瀏覽器(IE 或 Netscape)開啟頁面,選取任意檔案送出。跳過前幾個封包後,可捕獲到關鍵的 HTTP POST 封包。第一個封包包含 HTTP 標頭資訊,可透過 HttpServletRequest.getHeader() 取得,但無法用 getInputStream() 讀取。關於 HTTP 協定細節,可參考 W3C 標準。

HTTP 封包原始資料
圖 1. 擷取到的 HTTP POST 封包十六進位內容

封包中關鍵部分包含:

  • Content-Type: multipart/form-data; boundary=--------------------------7d1352a2016c:界定各欄位的邊界字串
  • 各表單欄位(type、id、file)與檔案二進位內容,皆以 boundary 分隔

3. Servlet 端解析邏輯

核心在於從 request.getInputStream() 讀取原始位元組流,依 boundary 切割欄位,再分別處理一般欄位與檔案內容。檔案部分需解析 Content-Disposition 標頭取得原始檔名,並將實體內容寫入伺服器磁碟。

關鍵技術要點

  • 邊界字串需從 Content-Type 標頭動態擷取,不可硬編碼
  • 檔案上傳過程需處理大量二進位資料,建議使用緩衝串流提升效能
  • 生產環境應加入檔案大小限制、副檔名驗證、儲存路徑安全性檢查等防護機制

結語

透過手動解析 multipart/form-data 封包,不僅能深入理解 HTTP 檔案上傳機制,也能在無法引入第三方函式庫的環境下實現上傳功能。後續可延伸為通用的上傳工具類,支援多檔案、進度顯示、斷點續傳等進階特性。

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