佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > HTML5實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳的方法

HTML5實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳的方法

熱門標(biāo)簽:美圖手機(jī) 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 硅谷的囚徒呼叫中心 檢查注冊(cè)表項(xiàng) 阿里云 智能手機(jī) 使用U盤裝系統(tǒng) 網(wǎng)站建設(shè)

HTML5的FILE api,有一個(gè)slice方法,可以將BLOB對(duì)象進(jìn)行分割。前端通過FileList對(duì)象獲取到相應(yīng)的文件,按照指定的分割方式將大文件分段,然后一段一段地傳給后端,后端再按順序一段段將文件進(jìn)行拼接。

斷點(diǎn)續(xù)傳原理

目前比較常用的斷點(diǎn)續(xù)傳的方法有兩種,一種是通過websocket接口進(jìn)行文件上傳,另一種是通過ajax,兩種方法各有千秋,雖然websocket聽起來比較高端些,但是除了用了不同的協(xié)議外其他的算法基本上都是很相似的,并且服務(wù)端要開啟ws接口,這里用相對(duì)方便的ajax來說明斷點(diǎn)上傳的思路。

說來說去,斷點(diǎn)續(xù)傳最核心的內(nèi)容就是把文件“切片”然后再一片一片的傳給服務(wù)器,但是這看似簡(jiǎn)單的上傳過程卻有著無數(shù)的坑。

首先是文件的識(shí)別,一個(gè)文件被分成了若干份之后如何告訴服務(wù)器你切了多少塊,以及最終服務(wù)器應(yīng)該如何把你上傳上去的文件進(jìn)行合并,這都是要考慮的。

因此在文件開始上傳之前,我們和服務(wù)器要有一個(gè)“握手”的過程,告訴服務(wù)器文件信息,然后和服務(wù)器約定切片的大小,當(dāng)和服務(wù)器達(dá)成共識(shí)之后就可以開始后續(xù)的文件傳輸了。

前臺(tái)要把每一塊的文件傳給后臺(tái),成功之后前端和后端都要標(biāo)識(shí)一下,以便后續(xù)的斷點(diǎn)。

當(dāng)文件傳輸中斷之后用戶再次選擇文件就可以通過標(biāo)識(shí)來判斷文件是否已經(jīng)上傳了一部分,如果是的話,那么我們可以接著上次的進(jìn)度繼續(xù)傳文件,以達(dá)到續(xù)傳的功能。

文件的前端切片

有了HTML5 的 File api之后切割文件比想象的要簡(jiǎn)單的多。

只要用slice 方法就可以了

var packet = file.slice(start, end);

參數(shù)start是開始切片的位置,end是切片結(jié)束的位置 單位都是字節(jié)。通過控制start和end 就可以是實(shí)現(xiàn)文件的分塊

如:

file.slice(0,1000); 
file.slice(1000,2000); 
file.slice(2000,3000); 
// ......

文件片段的上傳

上一部我們通過slice方法把文件分成了若干塊,接下來要做的事情就是把這些碎片傳到服務(wù)器上。

這里我們用ajax的post請(qǐng)求來實(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){ 
     // 選用 如果文件分塊大小較大 可以通過該方法判斷單片文件具體的上傳進(jìn)度 
     // e.loaded  該片文件上傳了多少 
     // e.totalSize 該片文件的總共大小 
} 
xhr.send(packet);

文件上傳到后臺(tái)后,后臺(tái)程序如PHP會(huì)做出相應(yīng)的處理。

標(biāo)簽:湖北 賀州 山南 煙臺(tái) 黃山 懷化 湘潭 通遼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML5實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳的方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    玛曲县| 英德市| 航空| 洪洞县| 隆回县| 鄢陵县| 浦城县| 和林格尔县| 开鲁县| 修武县| 元江| 呼和浩特市| 上蔡县| 巴东县| 筠连县| 洛扎县| 乳源| 新民市| 大姚县| 万源市| 车致| 界首市| 边坝县| 星座| 兴安盟| 巴林右旗| 静安区| 大关县| 惠安县| 始兴县| 合肥市| 张家口市| 瑞丽市| 和林格尔县| 娄底市| 塔城市| 休宁县| 柳州市| 大洼县| 攀枝花市| 偏关县|