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 實作全紀錄

編輯:XP 系統應用技巧

背景:FSO 只能處理文字,上傳二進位檔案成了 ASP 最大痛點

傳統 `FileSystemObject` 僅支援文字檔讀寫,無法處理二進位上傳。早期解法多依賴第三方元件(需註冊、有版權標示、相容性差)。本文從 HTTP 協定層面剖析上傳機制,並給出純 ASP 實作核心代碼。

HTTP 檔案上傳三大機制對比

機制核心特性適用性
RFC1867 (multipart/form-data)表單新增 ``,採用 MIME 多部分編碼,效率高、不編碼二進位資料,瀏覽器原生支援「瀏覽」按鈕✅ Web 應用首選,彈性最高,ASP/ASP.NET/PHP/Java 皆支援
HTTP PUTHTTP 1.1 新增 PUT 動詞,直接寫入伺服器資源,繞過應用層,需 ISAPI Filter 攔截處理❌ 破壞可程式性,極少用於 Web 應用
WebDAV擴充 HTTP 動詞支援鎖定/版控/上傳,Office「存到 Web」即基於此⚠️ 適合內容發布,不適合應用層整合上傳邏輯

結論:RFC1867 是 Web 應用整合檔案上傳的最佳標準。

ASP 純代碼實作核心邏輯(基於 RFC1867 + ADO Stream)

<!-- upload.htm -->
<form action="upload.asp" method="post" enctype="multipart/form-data">
  <input type="file" name="upfile">
  <input type="submit" value="上傳">
</form>

<!-- upload.asp 核心片段 -->
<%
Dim FormData, FormSize, DataStart, CLStr, DivStr
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize)  ' 讀取原始二進位資料

CLStr = ChrB(13) & ChrB(10)  ' CRLF
' 找到雙重 CRLF 結束的 header 結尾,資料起始位置
DataStart = InStrB(FormData, CLStr & CLStr) + 4

' 取得分隔境界字串 (第一行)
DivStr = LeftB(FormData, InStrB(FormData, CLStr) - 1)

' 計算檔案資料長度(扣除尾部境界)
DataSize = InStrB(DataStart + 1, FormData, DivStr) - DataStart - 2

' 擷取純檔案二進位內容
FormData = MidB(FormData, DataStart, DataSize)

' 使用 ADO Stream 儲存
Dim objStream
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1  ' adTypeBinary
objStream.Open
objStream.Write FormData
objStream.SaveToFile Server.MapPath("uploads/") & "filename.ext", 2  ' adSaveCreateOverWrite
objStream.Close
Set objStream = Nothing
%>

關鍵技術點解析

  • Request.BinaryRead:唯一能讀取 `multipart/form-data` 原始二進位資料的方法。
  • ChrB(13)&ChrB(10):二進位環境下的 CRLF,字串函數需用 `InStrB`/`MidB`/`LeftB` 等 B 系列。
  • 解析邏輯:HTTP 請求體結構為 `境界行` + `Header 區塊` + `CRLF+CRLF` + `檔案二進位資料` + `CRLF+境界行--`。代碼透過定位雙重 CRLF 與境界字串切割出純檔案資料。
  • ADODB.Stream:支援二進位讀寫、大檔案分段處理、編碼轉換,是純 ASP 處理二進位檔案的核心物件。

實務增強建議

  1. 檔案大小限制:IIS 預設上傳限制 200KB,需修改 Metabase `AspMaxRequestEntityAllowed` 或 `web.config` ``。
  2. 檔案型別驗證:不可信任 `Content-Type`,需檢查檔案簽名 (Magic Bytes) 與副檔名雙重驗證。
  3. 儲存路徑安全:上傳目錄設定「讀取/寫入」但「無執行權限」,防止腳本執行攻擊。
  4. 大檔案分段/進度條:純 ASP 難以支援,建議改用 ASP.NET `HttpPostedFile`、jQuery File Upload、Plupload 等現代方案。
  5. 元件替代:生產環境建議使用成熟元件(Persits ASPUpload、Dundas Upload、FreeASPUpload 等),已處理邊界條件、效能優化、安全性。

跨時代啟示

RFC1867 定義的 `multipart/form-data` 至今仍是 HTTP 檔案上傳的通用標準(HTML5 `FormData` API 底層即此)。理解其封包結構與解析邏輯,不僅能維護舊 ASP 系統,更能深入理解現代前後端檔案上傳協定,排查疑難雜症(如 Boundary 衝突、大檔案斷點續傳、雲端儲存簽名直傳等)。

Copyright © Windows教程網 All Rights Reserved