瀏覽器檔案上傳淺淡

2022-07-31 12:54:14 字數 2335 閱讀 3452

在出現 ajax 之前,前端是使用 form 表單進行提交資料的,它的結構大概是這樣:

get 類請求

其內容是新增到 url 的 query 部分的:

foo=bar&baz=the+first+line.%0d%0athe+second+line.%0d%0a

foo=bar&baz=the+first+line.%0d%0athe+second+line.%0d%0a

multipart/form-data

這種方式是支援傳輸其他型別的資料,比如檔案或者 blob 型別資料。

其格式如下:

------webkitformboundaryknskcas4s0ksenq3

content-disposition: form-data; name="外賣測試.png"; filename="pictures/aa.png"

content-type: image/png

------webkitformboundaryknskcas4s0ksenq3

content-disposition: form-data; name=".localized"; filename="pictures/.localized"

------webkitformboundaryknskcas4s0ksenq3

content-disposition: form-data; name="start.png"; filename="pictures/start.png"

content-type: image/png

------webkitformboundaryknskcas4s0ksenq3--

它的主要結構是以分界符進行分隔,每個分界符後面帶有\r\n,最後乙個分界符會多個--,表示資料傳輸結束。

它在服務端的解析可以參考

和其他型別的 input 相同,事件都是比較類似的。獲取值的方式為新增 change 事件即可。

除此之外,還支援幾個常用的屬性

在 change 事件中,可以從e.target.files獲取,它是個偽陣列,可用 slice 轉換為真正的陣列。

內部結構大概如下:

lastmodified: 1519638407937,

lastmodifieddate : mon feb 26 2018 17:46:47 gmt+0800 (cst)

name: "aaa.png"

size: 1222046

type: "image/png"

webkitrelativepath: "pictures/外賣測試.png"

這些引數都是比較有用的引數,利用它們可以實現各種複雜的功能。

普通 form 實現其中有最大的問題是表單提交後,頁面會進行跳轉,為了解決這個問題,將 form 的 target 設定為乙個隱藏的 iframe,

保證呼叫完成 submit 後仍舊可停留當前頁面

由於 ie10 後支援了 formdata 物件,這樣我們提交資料就很方便了。formdata 使用方法是:

xhr.send(form)實現起來就很簡單了

在有些情況下,可能在上傳要前展示本地的,所以我們需要讀取檔案。通用的一種方法是使用 url.createobjecturl,

當然,該方法還是處於草案階段,但瀏覽器已經基本支援了。它會生成了乙個以 blob:// 開頭的位址,指向乙個瀏覽器建立的臨時位址。

這樣相當於直接網路讀取。

對於一些小的也可以先進行讀取後展示,比如我們知道是支援 base64 的方式的,那麼我們就可以將轉為 base64 方式進行讀取。

如下例使用 filereader 進行讀取為 base64, 並進行 md5 校驗:

const reader = new filereader()

reader.onload = function (e)

reader.readasdataurl(file)

當然,對 base64 獲取的 md5 會與二進位制的不同,同時對於大檔案讀取至記憶體再處理會有諸多問題,這些都是可以考慮的乙個方向。

本文中實踐的示例在:

瀏覽器相容多檔案上傳控制項

新增上傳控制項 add click function 清空原生控制項值和自定義控制項值 cleanbtn live click function e 刪除新增的上傳控制項 removebtn live click function e 清空原生控制項值和自定義控制項值 filefield live ...

火狐谷歌瀏覽器上傳檔案問題

我們使用的ie瀏覽器可以獲取本地完整路徑,直接用 傳到後台乙個明路徑就可以。但是谷歌,火狐等瀏覽器保護客戶隱私,對我們本地路徑進行了遮蔽。導致無法獲取完整路徑,只能通過頁面將檔案流傳遞到後台,在進行解析操作。我們可以使用 ajaxfileupload.js檔案 ajaxfileupload succ...

瀏覽器限制檔案上傳的大小

如果使用瀏覽器上傳檔案,通過抓包的方式檢視http協議表頭的內容可以知道 1 在ie opera google瀏覽器中是不允許上傳2g以上的檔案,http表頭它會把檔案的大小標記為乙個負數,這樣則會很容易被防毒軟體攔截,誤認為是惡意攻擊,但在firefox和safari瀏覽器中則支2g以上的檔案上傳...