| 機制 | 特點 | 適用場景 |
|---|---|---|
| RFC1867 (multipart/form-data) | 表單新增 type="file"、enctype="multipart/form-data",MIME 多部分編碼,高效傳輸二進制,Web 應用程序可編程處理 | Web 表單上傳標準方案,ASP/PHP/JSP/ASP.NET 通用 |
| HTTP PUT | HTTP 1.1 新增動詞,直接寫入服務器資源,繞過應用層,需 ISAPI 過濾器攔截處理 | WebDAV/REST API、靜態資源發布,不適用表單上傳 |
| WebDAV | 擴展 HTTP 動詞 (PROPFIND/MKCOL/LOCK/COPY/MOVE),支持版本控制/鎖定,Office「保存到 Web」使用 | 協同編寫/版本管理,非表單上傳場景 |
結論: RFC1867 是 Web 應用程序集成文件上傳的最佳選擇。
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
%>
Request.TotalBytes / BinaryRead:獲取原始 HTTP 實體體。ChrB(13)&ChrB(10):二進制模式下的 CRLF (0x0D 0x0A)。boundary 位於請求頭第一行,格式如 ----WebKitFormBoundaryXYZ。Headers\r\n\r\nFileData\r\n--boundary--,雙 CRLF 後為文件內容。ADODB.Stream.Type=1 以二進制模式寫入,完美保存圖片/視頻/壓縮包等任意文件。HttpPostedFile / MVC IFormFile 現代模型。AspMaxRequestEntityAllowed (默認 200KB) 必須調大至業務最大文件 (如 100MB = 104857600)。