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

主頁 > 知識(shí)庫 > Html5大文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)方法

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

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

一般常用的web服務(wù)器都有對(duì)向服務(wù)器端提交數(shù)據(jù)有大小限制。超過一定大小文件服務(wù)器端將返回拒絕信息。當(dāng)然,web服務(wù)器都提供了配置文件可能修改限制的大小。針對(duì)iis實(shí)現(xiàn)大文件的上傳網(wǎng)上也有一些通過修改web服務(wù)器限制文件大小來實(shí)現(xiàn)。不過這樣對(duì)web服務(wù)器的安全帶了問題。攻擊者很容易發(fā)一個(gè)大數(shù)據(jù)包,將你的web服務(wù)器直接給拖死。
現(xiàn)在針對(duì)大文件上傳主流的實(shí)現(xiàn)方式,通過將大文件分塊。比如針對(duì)一個(gè)100M文件,按2M拆分為50塊。然后再將每塊文件依次上傳到服務(wù)器上,上傳完成后再在服務(wù)器上合并文件。
在web實(shí)現(xiàn)大文件上傳,核心主要實(shí)現(xiàn)文件的分塊。在Html5 File API 出現(xiàn)以前,要想在web上實(shí)現(xiàn)文件分塊傳輸。只有通過flash或Activex實(shí)現(xiàn)文件的分塊。

在Html5 下,我們可以直接通過file的slice 方法來實(shí)現(xiàn)文件的分塊。如:

XML/HTML Code復(fù)制內(nèi)容到剪貼板
  1. file.slice(0,1000);    
  2. file.slice(1000,2000);    
  3. file.slice(2000,3000);  
然后再通過XMLHttpRequest異步上傳到服務(wù)器。

Html5 上傳文件類庫

如果你有興趣及時(shí)間 ,當(dāng)然可以自己用html5的File API來實(shí)現(xiàn)。本人在網(wǎng)上查找到了以下兩個(gè)支持html5類庫。
resumable.js 附git上的地址:https://github.com/23/resumable.js
Pludload http://plupload.com/

resumable是一個(gè)純html5上傳類庫。
而Pludload是一個(gè)支持html5,flash,silverlight,html4,它會(huì)自動(dòng)判斷瀏覽是否支持html5不支持將用其它的上傳方式。
我測試下來,resumable和Pludload都支持html5分塊上傳文件。用下來覺得resumable比較適合,以下就選resumable來進(jìn)行介紹。

resumable.js斷點(diǎn)上傳使用介紹

主要配置介紹:
JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. var r = new Resumable({   
  2.             target:'/test/upload',   
  3.             chunkSize:1*1024*1024,   
  4.             simultaneousUploads:4,   
  5.             testChunks: true,   
  6.             throttleProgressCallbacks:1,   
  7.             method: "octet"  
  8.           });  
chunkSize 分塊文件大小,以字節(jié)為單位
simultaneousUploads 同時(shí)上傳文件塊的進(jìn)程數(shù),可以同時(shí)允許多個(gè)文件塊上傳。
testChunks 上前文件塊是否先通過get方式發(fā)送文件信息檢測文件是否已經(jīng)上傳。

resumable斷點(diǎn)上傳是通過testChunks配置節(jié)點(diǎn)來實(shí)現(xiàn),當(dāng)設(shè)置為true時(shí)。resumable會(huì)先發(fā)送一個(gè)get請(qǐng)求,如果http狀態(tài)返回 200。則認(rèn)為當(dāng)前塊已經(jīng)上傳完成,然后進(jìn)行下一塊的get請(qǐng)求。如果http狀態(tài)返回的不是200,則將通過post方式發(fā)送當(dāng)前塊數(shù)據(jù)包進(jìn)行文件塊上傳。

設(shè)置testChunks為true每次上傳都會(huì)增加一個(gè)get請(qǐng)求,如果我們已經(jīng)知道上次中斷上傳前文件的塊數(shù)。下次直接從中斷的塊數(shù)上傳就行了。這樣可以為每個(gè)塊減少一次http的get請(qǐng)求。
針對(duì)這個(gè)需求,我修改了resumable的源碼,為resumable里的file對(duì)象增加了一個(gè)startchunkindex的屬性,默認(rèn)為0。用于設(shè)置當(dāng)前文件從哪一個(gè)塊開始上傳。這樣,我們只需要在在文件上傳前從服務(wù)器上進(jìn)行一次查詢(查詢當(dāng)前文件上傳到哪一塊),返回上次上傳的文件塊索引。再將索引值設(shè)置到file的startchunkindex屬性就可以實(shí)現(xiàn)從上次斷開的文件塊開始上傳。
調(diào)用方式:

JavaScript Code復(fù)制內(nèi)容到剪貼板
  1. // Handle file add event   
  2.               r.on('fileAdded'function (file) {   
  3.                   file.startchunkindex = 0; // 設(shè)置當(dāng)前文件開始上傳的塊數(shù)  
具體可以查看附件里的demo。

收尾工作

所有文件塊上傳完,最后工作就是合并保存文件。附件為resumable斷上傳.net實(shí)現(xiàn)的服務(wù)端例子,包括簡單的文件合并功能。其它語言的demo大家也可以從resumable的git上下載。
demo例子為了簡單,只是把文件存放在本機(jī)。在真實(shí)的生產(chǎn)環(huán)境中。一般應(yīng)該放在單獨(dú)的文件服務(wù)器上(前臺(tái)web通過ftp或文件夾共享方式上傳到文件服務(wù)器),然后對(duì)上傳好的文件進(jìn)行分發(fā)鏡像或處理(比如視頻壓縮)。當(dāng)然最好是存在分布式文件系統(tǒng)中,目前看下來放到Hadoop分布式文件系統(tǒng)(HDFS)是一個(gè)不錯(cuò)的好方案。

demo

Vs2012 Html5 Upload demo下載

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Html5大文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)方法》,本文關(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
    余江县| 开远市| 盐池县| 务川| 西安市| 左权县| 屏山县| 永德县| 连江县| 丰台区| 南靖县| 广西| 宜良县| 阜新市| 金川县| 乌苏市| 泽州县| 延津县| 左云县| 乳源| 娄烦县| 南通市| 西贡区| 赤水市| 富顺县| 连城县| 建平县| 望奎县| 肥西县| 宜章县| 景东| 房山区| 正阳县| 句容市| 康平县| 枣庄市| 桃园县| 深州市| 青田县| 瓦房店市| 天台县|