首頁 > web前端 > H5教程 > 主體

詳細介紹HTML5 File api實作斷點續傳

黄舟
發布: 2017-03-27 15:11:25
原創
1528 人瀏覽過

目前市面上大多數的網站的斷點上傳都是需要安裝瀏覽器插件的,本文就針對高級瀏覽器的環境下,透過HTML5 File api實作斷點上傳進行說明

一、實作檔案多選

HTML5的新增了"multiple"屬性,該屬性可接受多個值的檔案上傳欄位

<input type="file" multiple="multiple" name="file" id="file">
登入後複製

新增了該屬性使用者就可以在彈出的對話方塊中一次選擇多個檔案了

二、實作檔案從電腦拖拉到網頁以及新增檔案佇列功能

這裡我們用dragover 和drop 兩個事件來管理檔案拖曳的功能

其中dragover 用來處理在指定的元素上移動時的事件,這裡我們透過給body綁定dragover時間來處理頁面中拖曳檔案的事件

document.body.addEventListener(&#39;dragover&#39;, dragFile, false);
function dragFile(evt) {
 evt.stopPropagation();
 evt.preventDefault();
 evt.dataTransfer.dropEffect = &#39;copy&#39;;
}
登入後複製

用drop 事件來處理滑鼠放開時候的事件,此時​​應該將使用者拖曳的檔案加入到上傳佇列中,以供後續的處理

document.body.addEventListener(&#39;drop&#39;, dropFile, false);
function dragFile(evt) {
 evt.stopPropagation();
 evt.preventDefault();
 // dataTransfer.files属性可以获取到所有拖动选择的文件,通过遍历可以读取到所有文件的信息。
 // 遍历每个文件可以获取到文件的 name、size、type、lastModifiedDate等关键信息
 var files = evt.dataTransfer.files;
 // addfile 方法 用来添加上传文件队列,在input的change事件中也需要调用
 // 该方法首先检查有无文件正在上传中,如果有就将后续加入的文件放到上传队列中,如果没有文件正在上传就直接执行上传命令
 addfile(files);
}
登入後複製

三、文件續傳原理

目前比較常用的斷點續傳的方法有兩種,一種是透過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請求來實作


#
textpop-up
登入後複製
var xhr = new XMLHttpRequest();
var url = xxx // 文件上传的地址 可以包括文件的参数 如文件名称 分块数等以便后台处理
xhr.open(&#39;POST&#39;, url, true);
xhr.onload = function (e){
 // 判断文件是否上传成功,如果成功继续上传下一块,如果失败重试该快
}
xhr.upload.onprogress = function(e){
 // 选用 如果文件分块大小较大 可以通过该方法判断单片文件具体的上传进度
 // e.loaded 该片文件上传了多少
 // e.totalSize 该片文件的总共大小
}
xhr.send(packet);
登入後複製


以上是詳細介紹HTML5 File api實作斷點續傳的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!