Sean's Note: RFC 1867 - Form-based File Upload in HTML

2014年8月11日 星期一

RFC 1867 - Form-based File Upload in HTML

在 RFC 1867 被提出之前,Form 的 INPUT 的類別僅有八種: CHECKBOX, HIDDEN, IMAGE,
PASSWORD, RADIO, RESET, SUBMIT, TEXT。在這之中似乎少了 FILE 可以讓使用者上傳檔
案。於是這份 RFC 便提出了兩個提案:
  1. 使 INPUT 多一個 FILE 的選項。
  2. 允許 INPUT 有一 ACCEPT 的屬性,指定可上傳的檔案類別。
由於原本的 application/x-www-form-urlencoded ,在傳輸大量的位元資料效率不彰,
所以也定義了新的 MIME 類別 multipart/form-data。
當撰寫 HTML 的程式設計師想向使用者請求一或多個檔案便可以寫成:
 <FORM ACTION="http://server.dom/cgi/handle" 
  ENCTYPE="multipart/form-data"
  METHOD=POST>
  What is your name? <INPUT TYPE=TEXT NAME=submitter>
  What files are you sending? <INPUT TYPE=FILE NAME=pics>

multipart/form-data 根據表單欄位包含了許多個部分,每個部分都應帶有:
  • Header: content-disposition: form-data; name="xxxxx",name 即是該欄位在表單中的名稱。
  • boundart: 自定義但不能出現在內文的的邊界字串。

實際從 Client 端傳回 Server 端的資料如下:
Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"; filename="file1.txt"
        Content-Type: text/plain

         ... contents of file1.txt ...
        --AaB03x--

如果使用者選擇了多個檔案,如多選了一個 file2.gif,則資料如下:
Content-type: multipart/form-data, boundary=AaB03x
       
        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"
        Content-type: multipart/mixed, boundary=BbC04y

        --BbC04y
        Content-disposition: attachment; filename="file1.txt"

        Content-Type: text/plain

        ... contents of file1.txt ...
        --BbC04y
        Content-disposition: attachment; filename="file2.gif"
        Content-type: image/gif
        Content-Transfer-Encoding: binary

          ...contents of file2.gif...
        --BbC04y--
        --AaB03x--

 Ref:
  1. http://www.faqs.org/rfcs/rfc1867.html
  2. http://blog.zhaojie.me/2011/03/html-form-file-uploading-programming.html 

沒有留言:

張貼留言