一、實現文件多選
HTML5的<input>新增了"multiple"屬性,該屬性可接受多個值的文件上傳字段
<input type="file" multiple="multiple" name="file" id="file">
添加了該屬性用戶就可以在彈出的對話框中一次性選擇多個文件了
二、實現文件從計算機拖拽到網頁以及添加文件隊列功能
這里我們用 dragover 和 drop 兩個事件來管理文件拖拽的功能
其中 dragover 用來處理在指定的元素上移動時的事件,這里我們通過給body綁定dragover時間來處理頁面中拖動文件的事件
document.body.addEventListener('dragover', dragFile, false); function dragFile(evt) { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = 'copy'; }
用 drop 事件來處理鼠標松開時候的事件,此時應該將用戶拖動過來的文件加入到上傳隊列中,以供后續的處理
document.body.addEventListener('drop', dropFile, false); function dragFile(evt) { evt.stopPropagation(); evt.preventDefault(); // dataTransfer.files屬性可以獲取到所有拖動選擇的文件,通過遍歷可以讀取到所有文件的信息。 // 遍歷每個文件可以獲取到文件的 name、size、type、lastModifiedDate等關鍵信息 var files = evt.dataTransfer.files; // addfile 方法 用來添加上傳文件隊列,在input的change事件中也需要調用 // 該方法首先檢查有無文件正在上傳中,如果有就將后續加入的文件放到上傳隊列中,如果沒有文件正在上傳就直接執行上傳命令 addfile(files); }
三、文件續傳原理
目前比較常用的斷點續傳的方法有兩種,一種是通過websocket接口進行文件上傳,另一種是通過ajax,兩種方法各有千秋,雖然websocket聽起來比較高端些~ 但是除了用了不同的協議外其他的算法基本上都是很相似的,并且服務端要開啟ws接口,這里用相對方便的ajax來說明斷點上傳的思路。
說來說去,斷點續傳最核心的內容就是把文件“切片”然后再一片一片的傳給服務器,但是這看似簡單的上傳過程卻有著無數的坑。
首先是文件的識別,一個文件被分成了若干份之后如何告訴服務器你切了多少塊,以及最終服務器應該如何把你上傳上去的文件進行合并,這都是要考慮的。
因此在文件開始上傳之前,我們和服務器要有一個“握手”的過程,告訴服務器文件信息,然后和服務器約定切片的大小,當和服務器達成共識之后就可以開始后續的文件傳輸了。
前臺要把每一塊的文件傳給后臺,成功之后前端和后端都要標識一下,以便后續的斷點。
當文件傳輸中斷之后用戶再次選擇文件就可以通過標識來判斷文件是否已經上傳了一部分,如果是的話,那么我們可以接著上次的進度繼續傳文件,以達到續傳的功能。
四、文件的前端切片
有了HTML5 的 File api之后切割文件比想想的要簡單的多的多。
只要用slice 方法就可以了
var packet = file.slice(start, end);
參數start是開始切片的位置,end是切片結束的位置 單位都是字節。通過控制start和end 就可以是實現文件的分塊
如
file.slice(0,1000); file.slice(1000,2000); file.slice(2000,3000); // ......
五、文件片段的上傳
上一部我們通過slice方法把文件分成了若干塊,接下來要做的事情就是把這些碎片傳到服務器上。
這里我們用ajax的post請求來實現
textpop-up
var xhr = new XMLHttpRequest(); var url = xxx // 文件上傳的地址 可以包括文件的參數 如文件名稱 分塊數等以便后臺處理 xhr.open('POST', url, true); xhr.onload = function (e){ // 判斷文件是否上傳成功,如果成功繼續上傳下一塊,如果失敗重試該快 } xhr.upload.onprogress = function(e){ // 選用 如果文件分塊大小較大 可以通過該方法判斷單片文件具體的上傳進度 // e.loaded 該片文件上傳了多少 // e.totalSize 該片文件的總共大小 } xhr.send(packet);
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com