感謝原博主:
一、http檔案上傳
html
type:型別
name:名字
method:post (post與get的區別是,post下引數值不會放在url後面,更加安全)
enctype:屬性規定在傳送到伺服器之前應該如何對表單資料進行編碼。
form表單
multipart/form-data:不對字元編碼,在使用包含檔案上傳控制項的表單時,必須使用該值。
對於multipart/form-fata型別的表單,瀏覽器上傳的實體內容中的每個表單字段元素的資料之間,
用字段分割線進行分割,兩個分割界線間的內容成為乙個分割槽,每個分割槽的內容可以被看做兩部分,
一部分是對錶單元字段元素進行描述的描述頭,
另一部分是表單元字段元素的主體內容
字段(content-type)
-----------------------
描述頭(換行\n)
分割槽(空行\r \n)
\r主體內容
-----------------------
二、伺服器
1.伺服器端程式收到"multipart/form-data"型別的http請求訊息
2.讀取這個請求訊息裡面的實體內容
3.解析每個分割槽的資料
4.從每個分割槽中解析出描述頭和主體內容部分
要在jsp裡面獲得上傳的檔案,就是通過request.getinputstream()來得到上傳的整個post實體的流。
1.用request.getheader("content-type")來取得實體內容的分解字串
2.根據http協議,分析取得的上傳實體流,把檔案部分篩選出來
3.儲存在故**的磁碟檔案中
4.由於上傳檔案時,form的屬性enctype="multipart/form-data",所以其他表單引數在上傳時無法得到
除了篩選出檔案進行儲存,還應該把其他的引數一起取出儲存,以便在jsp中呼叫
具體方法如下:
1.根據request獲得檔案輸入流
2.依次讀取行,此時進行兩部分內容的處理
(1)獲取檔名,以filename = "***"來標識乙個檔案頭
(2)獲取其他表單值,以name="***"來標識乙個表單頭
都以流頭的字元標識為值結束
實體內容內部的字段分隔界線是在content-type頭中指定的字段分隔界線前面增加了兩個"-"號而形成的。
(由瀏覽器隨機生成,保證上傳內容不重複)
當找到乙個分割槽的開始位置後,程式還需要分辨出分割槽中的描述頭和主體內容,並對他們分開儲存。
如何辨別描述頭和主體部分?
每個分割槽的描述頭和主體內容之間有乙個空行,描述頭後面有個換行。
因此描述頭和主體之間有"\n","\r","\n","\r"這四個連續的位元組內容進行分割,
並在位元組陣列緩衝區buffer中尋找這個特殊的分割界限來識別他倆。
根據督導的檔案資訊,比如檔名,檔案大小等,判斷是否合法,
合法就返回,不合法就建立同名檔案並將其刪除
日常中推薦使用元件(smartupload,fileupload,cos)
因為:1.讀取檔案大小限制(fileupload是建立臨時檔案)
2.讀取效率限制
這類元件的使用及封裝方式:
檔案上傳原理
個人概述 前台用form表單,將檔案放在request中。後台用request.getinputstream 從request中獲取檔案,主要是讀取檔案流,再將檔案流寫到指定檔案路徑下。眾所周知,在客戶端 中需要使用 來選擇要上傳的檔案,並上傳,如上 form action servlet uplo...
檔案上傳原理
檔案上傳漏洞 由於伺服器未對上傳的檔案 檔案型別 副檔名等 進行嚴格的驗證和過濾,造成攻擊者上傳惡意指令碼到伺服器端,從而執行攻擊者 這個過程就是檔案上傳漏洞。檔案上傳存在漏洞的原因 上傳檔案的時候,如果伺服器指令碼語言,未對上傳的檔案進行嚴格的驗證和過濾,就容易造成上傳任意檔案,包括上傳指令碼檔案...
PHP檔案上傳的原理及實現
php檔案上傳的原理及實現 利用php的檔案函式來實現上傳 這段 分為兩個檔案,乙個為upload.html,乙個是upload.php 其中,請注意 這是乙個標籤,我們要實現檔案的上傳,必須指定為 multipart form data,否則伺服器將不知道要幹什麼。值得注意的是檔案upload.h...