Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

ASP 文件上傳核心原理深度解析:RFC1867、ADO Stream BinaryRead 實戰代碼

編輯:Windows XP 系統介紹

HTTP 文件上傳三大機制對比

機制特點適用場景
RFC1867 (multipart/form-data)表單新增 type="file"、enctype="multipart/form-data",MIME 多部分編碼,高效傳輸二進制,Web 應用程序可編程處理Web 表單上傳標準方案,ASP/PHP/JSP/ASP.NET 通用
HTTP PUTHTTP 1.1 新增動詞,直接寫入服務器資源,繞過應用層,需 ISAPI 過濾器攔截處理WebDAV/REST API、靜態資源發布,不適用表單上傳
WebDAV擴展 HTTP 動詞 (PROPFIND/MKCOL/LOCK/COPY/MOVE),支持版本控制/鎖定,Office「保存到 Web」使用協同編寫/版本管理,非表單上傳場景

結論: RFC1867 是 Web 應用程序集成文件上傳的最佳選擇。

ASP 經典實現:ADO Stream + Request.BinaryRead

ASP 內建 Request 對象不解析 multipart/form-data,需手工解析二進制流。

核心代碼

<%@ Language=VBScript %>
<%
' upload.asp
Dim FormData, FormSize, DataStart, CLStr, DivStr
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize)  ' 讀取原始二進制流

CLStr = ChrB(13) & ChrB(10)  ' CRLF
' 定位數據區起始:雙 CRLF 後
DataStart = InStrB(FormData, CLStr & CLStr) + 4

' 提取分隔符 (boundary)
DivStr = LeftB(FormData, InStrB(FormData, CLStr) - 1)

' 計算文件數據長度:下一個 boundary 前
DataSize = InStrB(DataStart + 1, FormData, DivStr) - DataStart - 2

' 截取純文件二進制數據
FormData = MidB(FormData, DataStart, DataSize)

' 保存文件 (ADO Stream)
Dim Stream
Set Stream = Server.CreateObject("ADODB.Stream")
Stream.Type = 1  ' adTypeBinary
Stream.Open
Stream.Write FormData
Stream.SaveToFile Server.MapPath("uploaded_file.dat"), 2  ' adSaveCreateOverWrite
Stream.Close
Set Stream = Nothing
%>

關鍵點解析

  1. Request.TotalBytes / BinaryRead:獲取原始 HTTP 實體體。
  2. ChrB(13)&ChrB(10):二進制模式下的 CRLF (0x0D 0x0A)。
  3. 分隔符 boundary 位於請求頭第一行,格式如 ----WebKitFormBoundaryXYZ。
  4. 數據區結構:Headers\r\n\r\nFileData\r\n--boundary--,雙 CRLF 後為文件內容。
  5. ADODB.Stream.Type=1 以二進制模式寫入,完美保存圖片/視頻/壓縮包等任意文件。

生產環境建議

  • 上述代碼為教學級簡化版,**缺乏**:文件名提取、類型驗證、大小限制、路徑遍歷防護、並發鎖、錯誤處理、進度反饋。
  • 實際項目請使用成熟組件:**Persits ASPUpload**、**SoftArtisans FileUp**、**Dundas Upload**、**FreeASPUpload (開源)**、或 ASP.NET HttpPostedFile / MVC IFormFile 現代模型。
  • IIS 設置:AspMaxRequestEntityAllowed (默認 200KB) 必須調大至業務最大文件 (如 100MB = 104857600)。

安全加固清單

  1. 上傳目錄 **執行權限移除**,僅保留寫入權限。
  2. 文件重命名存儲 (GUID/時間戳+隨機數),拒絕原始文件名。
  3. MIME 類型白名單 + 文件頭魔數雙重驗證。
  4. 防病毒掃描集成 (ClamAV/ICAP)。
  5. 上傳目錄隔離在非系統盤,配置獨立應用池身份。
Copyright © Windows教程網 All Rights Reserved