国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js實現文件切片上傳,斷點續傳

widuu / 2061人閱讀

摘要:思路很簡單,拿到文件,保存文件唯一性標識,切割文件,分段上傳,每次上傳一段,根據唯一性標識判斷文件上傳進度,直到文件的全部片段上傳完畢。

思路很簡單,拿到文件,保存文件唯一性標識,切割文件,分段上傳,每次上傳一段,根據唯一性標識判斷文件上傳進度,直到文件的全部片段上傳完畢。

以下文字沒有完整的代碼,只有基礎理論,伸手黨繞道。

讀取文件
var input = document.querySelector("input");
input.addEventListener("change", function() {
    var file = this.files[0];
});
文件唯一性
var md5code = md5(file);
文件切割
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.addEventListener("load", function(e) {
    //每10M切割一段,這里只做一個切割演示,實際切割需要循環切割,
    var slice = e.target.result.slice(0, 10*1024*1024);
});
h5上傳一個(一片)文件
var formdata = new FormData();
formdata.append("0", slice);
//這里是有一個坑的,部分設備無法獲取文件名稱,和文件類型,這個在最后給出解決方案
formdata.append("filename", file.filename);
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", function() {
    //xhr.responseText
});
xhr.open("POST", "");
xhr.send(formdata);
xhr.addEventListener("progress", updateProgress);
xhr.upload.addEventListener("progress", updateProgress);

function updateProgress(event) {
    if (event.lengthComputable) {
        //進度條
    }
}
無法獲取文件類型的設備解決方案
首先在:http://www.garykessler.net/li...
這里只給出了常見的圖片和視頻的文件類型判斷
function checkFileType(type, file, back) {
    /**
     * type png jpg mp4 ...
     * file input.change=> this.files[0]
     * back callback(boolean)
     */
    // http://www.garykessler.net/library/file_sigs.html
    var args = arguments;
    if (args.length != 3) {
        back(0);
    }
    var type = args[0]; // type = "(png|jpg)" , "png"
    var file = args[1];
    var back = typeof args[2] == "function" ? args[2] : function() {};
    if (file.type == "") {
        // 如果系統無法獲取文件類型,則讀取二進制流,對二進制進行解析文件類型
        var imgType = [
            "ff d8 ff", //jpg
            "89 50 4e", //png

            "0 0 0 14 66 74 79 70 69 73 6F 6D", //mp4
            "0 0 0 18 66 74 79 70 33 67 70 35", //mp4
            "0 0 0 0 66 74 79 70 33 67 70 35", //mp4
            "0 0 0 0 66 74 79 70 4D 53 4E 56", //mp4
            "0 0 0 0 66 74 79 70 69 73 6F 6D", //mp4

            "0 0 0 18 66 74 79 70 6D 70 34 32", //m4v
            "0 0 0 0 66 74 79 70 6D 70 34 32", //m4v

            "0 0 0 14 66 74 79 70 71 74 20 20", //mov
            "0 0 0 0 66 74 79 70 71 74 20 20", //mov
            "0 0 0 0 6D 6F 6F 76", //mov

            "4F 67 67 53 0 02", //ogg
            "1A 45 DF A3", //ogg

            "52 49 46 46 x x x x 41 56 49 20", //avi (RIFF fileSize fileType LIST)(52 49 46 46,DC 6C 57 09,41 56 49 20,4C 49 53 54)
        ];
        var typeName = [
            "jpg",
            "png",
            "mp4",
            "mp4",
            "mp4",
            "mp4",
            "mp4",
            "m4v",
            "m4v",
            "mov",
            "mov",
            "mov",
            "ogg",
            "ogg",
            "avi",
        ];
        var sliceSize = /png|jpg|jpeg/.test(type) ? 3 : 12;
        var reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.addEventListener("load", function(e) {
            var slice = e.target.result.slice(0, sliceSize);
            reader = null;
            if (slice && slice.byteLength == sliceSize) {
                var view = new Uint8Array(slice);
                var arr = [];
                view.forEach(function(v) {
                    arr.push(v.toString(16));
                });
                view = null;
                var idx = arr.join(" ").indexOf(imgType);
                if (idx > -1) {
                    back(typeName[idx]);
                } else {
                    arr = arr.map(function(v) {
                        if (i > 3 && i < 8) {
                            return "x";
                        }
                        return v;
                    });
                    var idx = arr.join(" ").indexOf(imgType);
                    if (idx > -1) {
                        back(typeName[idx]);
                    } else {
                        back(false);
                    }

                }
            } else {
                back(false);
            }

        });
    } else {
        var type = file.name.match(/.(w+)$/)[1];
        back(type);
    }
}
調用方法
checkFileType("(mov|mp4|avi)",file,function(fileType){
    // fileType = mp4,
    // 如果file的類型不在枚舉之列,則返回false
});
上面上傳文件的一步,可以改成:
formdata.append("filename", md5code+"."+fileType);

總結:有了切割上傳,有了文件唯一標識信息(文件md5)斷點續傳只不過是后臺的一個小小的判斷邏輯而已。

未來,前端,大有可為

有些小伙伴不是太清楚后臺的小小的判斷是怎么做的:
這里貼一張圖給大家參考,自己手畫,有點丑,將就下。

后續我再畫一張完整的上傳流程圖給更新上來。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83045.html

相關文章

  • 分片上傳斷點續傳解決方案

    摘要:所以,該文適合于全棧工程師,至少是想成為還有,為什么需要分片,不分片能實現斷點續傳嗎分片是為了充分利用網絡帶寬,加快上傳速度不分片也是能夠實現斷點續傳的。詳細參考文件上傳組件深度剖析分片上傳與斷點續傳之間沒有很直接的關系好了,進入正題。 上傳文件,基本上是每一個網站應用都會具備的一個功能。對于一個網絡存儲應用,對于上傳功能要求更是迫切。 如今市面上成熟上傳插件,如WebUpload...

    includecmath 評論0 收藏0
  • 基于Node.js的大文件分片上傳

    摘要:基于的大文件分片上傳我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。所以把文件名稱加上。后續延伸斷點續傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。同時如...

    Genng 評論0 收藏0
  • 基于Node.js的大文件分片上傳

    摘要:基于的大文件分片上傳我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。所以把文件名稱加上。后續延伸斷點續傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。同時如...

    lcodecorex 評論0 收藏0
  • 基于Node.js的大文件分片上傳

    摘要:基于的大文件分片上傳我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。所以把文件名稱加上。后續延伸斷點續傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。同時如...

    BigTomato 評論0 收藏0
  • 基于Node.js的大文件分片上傳

    摘要:基于的大文件分片上傳我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。所以把文件名稱加上。方便后續文件合并。 基于Node.js的大文件分片上傳 我們在做文件上傳的時候,如果文件過大,可能會導致請求超時的情況。所以,在遇到需要對大文件進行上傳的時候,就需要對文件進行分片上傳的操作。同時如果文件過大,在...

    W4n9Hu1 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<