1. 程式人生 > >為什麼上傳檔案的表單裡要加個屬性 enctype

為什麼上傳檔案的表單裡要加個屬性 enctype

上傳檔案的表單中<form>要加屬性enctype="multipart/form-data",很多人只是死記硬背知道上傳表單要這麼 寫,知其然而不知其所以然。那到底為什麼要新增這個屬性呢?它是什麼意思呢?它又有什麼其他可選值呢? 其實form表單在你不寫enctype屬性時,也預設為其添加了enctype屬性值,預設值是enctype="application/x- www-form-urlencoded".這個屬性管理的是表單的MIME編碼,共有三個值可選:

  ①application/x-www-form-urlencoded (預設值)

  ②multipart/form-data


  ③text/plain

  其中①application/x-www-form-urlencoded是預設值,大家可能在AJAX裡見過這 個:xmlHttp.setRequestHeader("Content-Type","application/x-www-form- urlencoded"); 這兩個要做的是同一件事情,就是設定表單傳輸的編碼。在AJAX裡不寫有可能會報錯,但是在HTML的form表單裡是可以不寫 enctype="application/x-www-form-urlencoded"的,因為預設HTML表單就是這種傳輸編碼型別。而 ②multipart-form-data是用來指定傳輸資料的特殊型別的,主要就是我們上傳的非文字的內容,比如圖片或者mp3等等。 ③text/plain是純文字傳輸的意思,在傳送郵件時要設定這種編碼型別,否則會出現接收時編碼混亂的問題,網路上經常拿text/plain和 text/html做比較,其實這兩個很好區分,前者用來傳輸純文字檔案,後者則是傳遞html程式碼的編碼型別,在傳送標頭檔案時才用得上。①和③都不能用 於上傳檔案,只有multipart/form-data才能完整的傳遞檔案資料。


  上面提到的MIME,它的英文全稱是"Multipurpose Internet Mail Extensions" 多功能Internet 郵件擴充服務,它是一種多用途網際郵件擴充協議,在1992年最早應用於電子郵件系統,但後來也應用到瀏覽器。伺服器會將它們傳送的多媒體資料的型別告訴 瀏覽器,而通知手段就是說明該多媒體資料的MIME型別,從而讓瀏覽器知道接收到的資訊哪些是MP3檔案,哪些是Shockwave檔案等等。伺服器將 MIME標誌符放入傳送的資料中來告訴瀏覽器使用哪種外掛讀取相關檔案。

  簡單說,MIME型別就是設定某種副檔名的檔案用一種應用程式來開啟的方式型別,當該副檔名檔案被訪問的時候,瀏覽器會自動使用指定應用程式來開啟。多用於指定一些客戶端自定義的檔名,以及一些媒體檔案開啟方式。


  瀏覽器接收到檔案後,會進入外掛系統進行查詢,查找出哪種外掛可以識別讀取接收到的檔案。如果瀏覽器不清楚呼叫哪種外掛系統,它可能會告訴使用者缺少某 外掛,或者直接選擇某現有外掛來試圖讀取接收到的檔案,後者可能會導致系統的崩潰。傳輸的資訊中缺少MIME標識可能導致的情況很難估計,因為某些計算機 系統可能不會出現什麼故障,但某些計算機可能就會因此而崩潰。

     檢查一個伺服器是否正確設定了MIME型別的步驟是:

  1. 在Netscape瀏覽器中開啟伺服器網頁

  2. 進入"View"選單,選擇"Page Info"

  3. 在彈出的視窗中點選上層框架中的"EMBED"

  4. 在下層框架中檢視MIME的型別是否為"application/x-director"或"application/x-shockwave- flash",如果是上述資訊的話表明伺服器已經正確設定了MIME型別;而如果MIME型別列出的是文字內容、八位一組的資料或是其它形式均表明伺服器 的MIME型別沒有設定正確。

  如果伺服器沒有正確標明其傳送的資料的型別,伺服器管理員應該正確新增相關資訊,具體操作方法非常簡單快捷。

  每個MIME型別由兩部分組成,前面是資料的大類別,例如聲音audio、圖象image等,後面定義具體的種類。

常見的MIME型別

  
  超文字標記語言文字 .html,.html text/html

    普通文字 .txt text/plain

    RTF文字 .rtf application/rtf

    GIF圖形 .gif image/gif

    JPEG圖形 .jpeg,.jpg image/jpeg

    au聲音檔案 .au audio/basic

    MIDI音樂檔案 mid,.midi audio/midi,audio/x-midi

    RealAudio音樂檔案 .ra, .ram audio/x-pn-realaudio

    MPEG檔案 .mpg,.mpeg video/mpeg

    AVI檔案 .avi video/x-msvideo

    GZIP檔案 .gz application/x-gzip

    TAR檔案 .tar application/x-tar

    Internet中有一個專門組織IANA來確認標準的MIME型別,但Internet發展的太快,很多應用程式等不及IANA來確認他們使用 的MIME型別為標準型別。因此他們使用在類別中以x-開頭的方法標識這個類別還沒有成為標準,例如:x-gzip,x-tar等。事實上這些型別運用的 很廣泛,已經成為了事實標準。只要客戶機和伺服器共同承認這個MIME型別,即使它是不標準的型別也沒有關係,客戶程式就能根據MIME型別,採用具體的 處理手段來處理資料。而Web伺服器和瀏覽器(包括作業系統)中,預設都設定了標準的和常見的MIME型別,只有對於不常見的 MIME型別,才需要同時設定伺服器和客戶瀏覽器,以進行識別。
----------------------------------------------------------------
表單中enctype="multipart/form-data"的意思,是設定表單的MIME編碼。預設情況,
這個編碼格式是application/x-www-form-urlencoded,不能用於檔案上傳;
只有使用了multipart/form-data,才能完整的傳遞檔案資料,進行下面的操作.
enctype="multipart/form-data"是上傳二進位制資料; form裡面的input的值以2進位制的方式傳過去。
form裡面的input的值以2進位制的方式傳過去,
所以request就得不到值了。也就是說加了這段程式碼,用request就會傳遞不成功,取表單值加入資料庫時,用到下面的:

SmartUpload su = new SmartUpload();//新建一個SmartUpload物件

su.getRequest().getParameterValues();取陣列值

su.getRequest().getParameter( );取單個引數單個值

轉載自    http://blog.sina.com.cn/s/blog_7295544701010a89.html