您好,登錄后才能下訂單哦!
HTML5中怎么實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳功能,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
目前比較常用的斷點(diǎn)續(xù)傳的方法有兩種,一種是通過(guò)websocket接口進(jìn)行文件上傳,另一種是通過(guò)ajax,兩種方法各有千秋,雖然websocket聽(tīng)起來(lái)比較高端些,但是除了用了不同的協(xié)議外其他的算法基本上都是很相似的,并且服務(wù)端要開(kāi)啟ws接口,這里用相對(duì)方便的ajax來(lái)說(shuō)明斷點(diǎn)上傳的思路。
說(shuō)來(lái)說(shuō)去,斷點(diǎn)續(xù)傳最核心的內(nèi)容就是把文件“切片”然后再一片一片的傳給服務(wù)器,但是這看似簡(jiǎn)單的上傳過(guò)程卻有著無(wú)數(shù)的坑。
首先是文件的識(shí)別,一個(gè)文件被分成了若干份之后如何告訴服務(wù)器你切了多少塊,以及最終服務(wù)器應(yīng)該如何把你上傳上去的文件進(jìn)行合并,這都是要考慮的。
因此在文件開(kāi)始上傳之前,我們和服務(wù)器要有一個(gè)“握手”的過(guò)程,告訴服務(wù)器文件信息,然后和服務(wù)器約定切片的大小,當(dāng)和服務(wù)器達(dá)成共識(shí)之后就可以開(kāi)始后續(xù)的文件傳輸了。
前臺(tái)要把每一塊的文件傳給后臺(tái),成功之后前端和后端都要標(biāo)識(shí)一下,以便后續(xù)的斷點(diǎn)。
當(dāng)文件傳輸中斷之后用戶再次選擇文件就可以通過(guò)標(biāo)識(shí)來(lái)判斷文件是否已經(jīng)上傳了一部分,如果是的話,那么我們可以接著上次的進(jìn)度繼續(xù)傳文件,以達(dá)到續(xù)傳的功能。
有了HTML5 的 File api之后切割文件比想象的要簡(jiǎn)單的多。
只要用slice 方法就可以了
var packet = file.slice(start, end);
參數(shù)start是開(kāi)始切片的位置,end是切片結(jié)束的位置 單位都是字節(jié)。通過(guò)控制start和end 就可以是實(shí)現(xiàn)文件的分塊
如:
file.slice(0,1000);
file.slice(1000,2000);
file.slice(2000,3000);
// ......
上一部我們通過(guò)slice方法把文件分成了若干塊,接下來(lái)要做的事情就是把這些碎片傳到服務(wù)器上。
這里我們用ajax的post請(qǐng)求來(lái)實(shí)現(xiàn)
var xhr = new XMLHttpRequest();
var url = xxx // 文件上傳的地址 可以包括文件的參數(shù) 如文件名稱 分塊數(shù)等以便后臺(tái)處理
xhr.open('POST', url, true);
xhr.onload = function (e){
// 判斷文件是否上傳成功,如果成功繼續(xù)上傳下一塊,如果失敗重試該快
}
xhr.upload.onprogress = function(e){
// 選用 如果文件分塊大小較大 可以通過(guò)該方法判斷單片文件具體的上傳進(jìn)度
// e.loaded 該片文件上傳了多少
// e.totalSize 該片文件的總共大小
}
xhr.send(packet);
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。