鍍金池/ 問(wèn)答/PHP/ php 大文件分段上傳,會(huì)出現(xiàn)個(gè)別wmv文件上傳之后視頻播放到一定時(shí)間就錯(cuò)誤

php 大文件分段上傳,會(huì)出現(xiàn)個(gè)別wmv文件上傳之后視頻播放到一定時(shí)間就錯(cuò)誤

/*

*/
var slice_upload = {

fileInput: null, //html file控件
fileFilter: [], //過(guò)濾后的文件數(shù)組
url: '', //ajax地址
nSlice_count: 100, //分段數(shù)
nFactCount: null, //實(shí)際分段數(shù)
nMin_size: 0.5, //最小分段大小(M)
nMax_size: 5, //最大分段大小(M),
totalSize: 0, //文件總大小,
uploadSize: 0, //已上傳大小
error: 0,
fdata: '', //上傳文件附加的信息,
timeout: 60000, //超時(shí)時(shí)間毫秒,
errormsg: '',
filter: function (files) {        //選擇文件組的過(guò)濾方法
    return files;
},
current_upload: 0, //當(dāng)前上傳的文件索引
onFailure: function () {}, //上傳失敗時(shí)
onDelete: function () {}, //文件刪除后
onSelect: function () {}, //文件選擇后
onPause: function () {}, //文件暫停后
formData: {},
//獲取選擇文件,file控件或拖放
funGetFiles: function (e) {

    // 獲取文件列表對(duì)象
    var files = e.target.files || e.dataTransfer.files;

    //繼續(xù)添加文件
    files = this.filter(files);
    for (var i = 0; i < files.length; i++) {
        this.fileFilter.push(files[i]);
    }




    this.funDealFiles();
    return this;
},
//選中文件的處理與回調(diào)
funDealFiles: function () {
    this.totalSize = 0;
    for (var i = 0, file; i < this.fileFilter.length; i++) {
        file = this.fileFilter[i];
        //增加唯一索引值
        file.index = i;
        this.totalSize += file.size;
        file.upSize = 0;
        file.content = '';
        file.pause = false;//是否暫停
        file.end_upload = false;//是否已經(jīng)上傳完成
        if (file.hasOwnProperty('nCountNum') == false) {
            //分段設(shè)置
            file.nCountNum = 0;
            file.nFactSize = file.size / this.nSlice_count;
            file.nFactSize = (file.nFactSize >= this.nMin_size * 1024 * 1024 ? file.nFactSize : this.nMin_size * 1024 * 1024);
            file.nFactSize = (file.nFactSize <= this.nMax_size * 1024 * 1024 ? file.nFactSize : this.nMax_size * 1024 * 1024);
            file.nFactCount = Math.ceil(file.size / file.nFactSize);
            file.complete = 0;
        }
    }
    this.onSelect(this.fileFilter);
    return this;
},
//刪除對(duì)應(yīng)的文件
funDeleteFile: function (fileDelete) {
    var arrFile = [];
    for (var i = 0, file; i < this.fileFilter.length; i++) {
        file = this.fileFilter[i];

        if (file != fileDelete) {

            arrFile.push(file);
        } else {

            this.totalSize = this.totalSize - file.size;
            this.onDelete(fileDelete);
        }
    }
    this.fileFilter = arrFile;
    return this;
},
onProgress: function () {},
uploadfile: function () {
    this.uploadone(this.fileFilter[0]);
},
init: function () {
    var self = this;

    //文件選擇控件選擇
    if (this.fileInput) {
        this.fileInput.addEventListener("change", function (e) {
            self.funGetFiles(e);
        }, false);
    }




},
uploadone: function (file) {
    if (file.pause == true && file.index == this.current_upload) {
        return;
    }
    if (file.end_upload == true) {
        if (typeof (this.fileFilter[file.index + 1]) !== 'undefined') {
            this.current_upload = file.index + 1;
            this.uploadone(this.fileFilter[file.index + 1]);
        }
        return;
    }
    var fData = new FormData();

    var self = this;
    //分段設(shè)置
    var start = file.nCountNum * file.nFactSize;
    var end = Math.min(start + file.nFactSize, file.size);

    fData.append("file", file.slice(start, end));
    fData.append("name", file.name);
    fData.append("size", file.size);
    fData.append("totalCount", file.nFactCount);
    fData.append("indexCount", file.nCountNum);
    fData.append("content", file.content);
    for (var i in self.formData) {
        fData.append(i, self.formData[i]);
    }

    var xhr = new XMLHttpRequest();
    t1 = setTimeout(function () {
        self.errormsg = '超時(shí)了';
        xhr.abort();
        return false;
    }, self.timeout);
    // 文件上傳成功或是失敗
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState == 4) {
            if (t1) {
                clearTimeout(t1);
            }
            if (xhr.responseText) {
                var res = JSON.parse(xhr.responseText);
                if (xhr.status != 200 || res.status == 0) {
                    self.error = 1;
                    self.onFailure(res.msg);
                    self.funPause(file);
                    return false;
                }
            }

        }
    };

    xhr.addEventListener("progress", function (e) {

        //   self.onProgress(file, e);
    }, false);

    xhr.addEventListener("load", function (e) {
        self.onLoad(file, e);
    }, false);
    xhr.addEventListener("error", function () {
        self.onFailure('上傳出錯(cuò)'); //上傳出錯(cuò)
        self.funPause(file);
    }, false);

    xhr.addEventListener("abort", function () {
        if (self.errormsg) {
            var msg = self.errormsg;
        } else {
            var msg = '上傳出錯(cuò)';
        }
        self.onFailure(msg); //上傳出錯(cuò)
        self.funPause(file);
    }, false);

    if (self.url.indexOf('?') >= 0) {
        var url = self.url + '&rand=' + Math.random();
    } else {
        var url = self.url + '?rand=' + Math.random();
    }
    xhr.open("POST", url, true);
    xhr.send(fData);
},
onLoad: function (file, e) {
    if(this.error == 1){
        return  false;
    };
    var res = JSON.parse(e.target.responseText);

    var upSize = (file.nCountNum + 1) * file.nFactSize;
    upSize = upSize > file.size ? file.size : upSize;

    file.upSize = upSize;
    this.uploadSize += file.upSize;
    this.uploadSize = this.uploadSize > this.totalSize ? this.totalSize : this.uploadSize;

    this.onProgress(file, e, res);

    if (file.nCountNum + 1 != file.nFactCount)
    {
        if (res.status == 1) {
            //分段沒(méi)有完成,繼續(xù)上傳
            file.nCountNum++;
            this.uploadone(file);
            return;
        }
        if (res.status == 0) {
            // this.onFailure(res.msg);
            return false;
        }

    } else {
        //分段上傳完成
        if (res.status == 0) {
            //  this.onFailure(res.msg);
            return false;
        }
        file.end_upload = true;
        if (typeof (this.fileFilter[file.index + 1]) !== 'undefined') {
            this.current_upload = file.index + 1;
            this.uploadone(this.fileFilter[file.index + 1]);
            return;
        }

        var self = this;
        if (this.uploadSize == this.totalSize) {
            setTimeout(function () {
                self.onComplete();
            }, 500);
        }

    }


},
funPause: function (file) {
    file.pause = true;//是否暫停
    this.onPause(file);
}



};

這是文件分段的js

后臺(tái)處理就是普通的讀上傳到的文件塊然后通過(guò)追加的方式來(lái)進(jìn)行完整的文件合并

回答
編輯回答
小曖昧

很明顯,傳輸過(guò)程中丟包了,導(dǎo)致數(shù)據(jù)不完整,你應(yīng)該用md5校驗(yàn)完整性

2018年4月30日 04:43