JavaBean 是基於 Java 的軟體組件,JSP 對其整合提供完善支援,不僅縮短開發時間(復用經測試可信組件),更賦予應用更強擴展性。文件上傳在 B/S 開發中極常見。對比其他工具:JSP 不像 ASP 必須用組件,也不像 PHP 直接支援上傳。JSP 實現方式:用 ServletRequest.getInputStream() 獲取客戶端數據流,解析參數與文件數據,存儲為文件或入庫。通常不在 JSP 頁面處理,而是放入 Servlet 或 JavaBean。本文介紹 JavaBean 實現多文件上傳,採 HTTP 與 FTP 兩種協議,原理差異大。調試環境:Win2000 Server + Apache + Tomcat 4.0,JDK 1.4 + EditPlus。
早期 HTML 表單不支援文件上傳。RFC1867 擴展表單,新增 <input type="file"> 元素,瀏覽器自動生成輸入框與「瀏覽」按鈕。表單實現:
<FORM METHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data">
<INPUT type="file" size="50" name="FILE1">
<INPUT type="submit" value="Upload">
</FORM>
選擇文件後表單提交至 *.jsp,實現 HTTP 文件上傳。傳輸由 HTTP 協議 CGI 支援,要求瀏覽器與 Web Server 均支援 RFC1867。JavaBean 通過 getInputStream() 獲取數據流、分析格式,按分隔符分離多文件輸出到服務器目標目錄。核心類 testUpload 框架:
public class testUpload {
public testUpload(){...}
public final void initialize(ServletConfig config) throws ServletException {
m_application = config.getServletContext();
}
public void upload() throws testUploadException, IOException, ServletException {...}
private void getDataSection(){...}
private void getDataHeader(){...}
public int save(String destPathName) throws SmartUploadException, IOException, ServletException {...}
...
}
initialize() 初始化 Servlet 環境,upload() 獲取輸入流並分析格式,將屬性賦給多個 File 實例(由 Files 管理),File.save() 依次輸出文件。upload() 是關鍵,分析 HTTP 1.1 協議傳輸格式。測試發現上傳 t.txt 格式如下:
// 文件分隔符
-----------------------------7d226137250336
// 文件信息頭
Content-Disposition: form-data; name="FILE1"; filename="C:\Documents and Settings\Administrator\My Documents\t.sql"
Content-Type: text/plain
// 源文件內容
create table info ( content image null );
// 下一個文件分隔符
-----------------------------7d226137250336
Content-Disposition: form-data; name="FILE2"; filename=""
Content-Type: application/octet-stream
-----------------------------7d226137250336
HTTP 上傳多文件時,所有文件放入輸入流並以隨機分隔符區分(分隔符即傳輸流第一個回車符前的所有字符)。upload() 需分析:確定分隔符、各文件格式、完整路徑、數據始末位置。
FTP 方式原理不同,適合大文件、斷點續傳場景,核心在於建立 FTP 連接、進入被動/主動模式、流式傳輸。代碼結構類似但底層通訊協議不同。