HTML5实现文件断点续传
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會做出相應的處理。
轉載于:https://www.cnblogs.com/zhangwc/p/6248516.html
總結
以上是生活随笔為你收集整理的HTML5实现文件断点续传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js的命名规范
- 下一篇: 华为交换机端口隔离配置