HTML5的FILE api,有一個slice方法,可以將BLOB物件分割。前端透過FileList物件取得對應的文件,依照指定的分割方式將大文件分段,然後一段一段地傳給後端,後端再依序一段將文件進行拼接。
斷點續傳原理
目前比較常用的斷點續傳的方法有兩種,一種是透過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請求來實作
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);
#檔案上傳到後台後,後台程式如PHP會做出對應的處理。
以上就是HTML5實作檔案斷點續傳的方法 的內容,更多相關內容請關注PHP中文網(www.php.cn)!