檔案上傳原理及流程

2021-08-03 03:40:07 字數 1743 閱讀 3055

感謝原博主:

一、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...