Skip to content
This repository has been archived by the owner on Aug 22, 2022. It is now read-only.

怎么跳过某些分块? #139

Closed
mrzzcn opened this issue Apr 10, 2014 · 11 comments
Closed

怎么跳过某些分块? #139

mrzzcn opened this issue Apr 10, 2014 · 11 comments
Labels

Comments

@mrzzcn
Copy link

mrzzcn commented Apr 10, 2014

上传过程可能中断,总共10块,传了8块,下次上传如何跳过?

@2betop
Copy link
Contributor

2betop commented Apr 10, 2014

在发送分片前会request一个before-sendcommand.
在这个command的callback里面如果返回的是一个promise, 且此promise被reject了,那么此分片就跳过了。

@2betop
Copy link
Contributor

2betop commented Apr 10, 2014

以下是伪代码

WebUploader.Uploader.register({
    'before-send': 'checkchunk'
}, {
    checkchunk: function( block ) {
        var blob = block.blob.getSource(),
            deferred = $.Deferred();

        // 这个肯定是异步的,需要通过FileReader读取blob后再算。
        md5Blob( blob, function( error, ret ) {
            // 读取md5出错的话,分片不能跳过。
            if ( error ) {
                deferred.resolve();
            } else {

                // 方案1
                // 将md5结果通过ajax与服务端验证
                $.ajax( xxx ).then(function( response ) {

                    // 更具md5与服务端匹配,如果重复,则跳过。
                    if ( xxx ) {
                        deferred.reject();
                    } else {
                        deferred.resolve();
                    }
                });

                // 方案二
                // 在这个文件上传前,一次性把所有已成功的分片md5拿到。
                // 在这里只需本地验证就ok
                if ( hash[ ret ] ) {
                    deferred.reject();
                } else {
                    deferred.resolve();
                }
            }
        });

        return deferred.promise();
    }
});

@mrzzcn
Copy link
Author

mrzzcn commented Apr 10, 2014

Thanks.

@beyondonly
Copy link

@2betop
请问一下 md5Blob()这个方法你们提供了还是需要第三方的

@2betop
Copy link
Contributor

2betop commented Nov 4, 2014

@beyond290239 直接用这个吧。http://fex.baidu.com/webuploader/doc/index.html#WebUploader_Uploader_md5File

@beyondonly
Copy link

@2betop
分块进行md5好慢,而且比做整个文件的MD5更慢,是我写法有问题,还是本身在计算分块md5的时候就很慢
WebUploader.Uploader.register({
'before-send': 'checkchunk'
}, {
checkchunk: function( block ) {
var me = this,
owner = this.owner,
deferred = $.Deferred();

                        owner.md5File(block.blob)

                            // 如果读取出错了,则通过reject告诉webuploader文件上传出错。
                            .fail(function() {
                                deferred.reject();
                            })

                            // md5值计算完成
                            .then(function( md5 ) {

                                // 与服务端验证
                                $.ajax('/CDFDemo/verify', {
                                    dataType: 'json',
                                    data: {
                                        md5: md5
                                    },
                                    success: function( response ) {
                                        alert(response+"before-send");
                                        // 如果验证已经上传过
                                        if ( response ) {
                                            console.log('文件重复,已跳过');
                                        }

                                        // 介绍此promise, webuploader接着往下走。
                                        deferred.resolve();
                                    }
                                });
                            });

                        return deferred.promise();
                    }
                });

@pengliangzhong
Copy link

@2betop
请问注册的before-send事件和uploadBeforeSend事件的执行先后顺序如何,js小白,望大师指点,谢谢!

@bisu328
Copy link

bisu328 commented Jun 25, 2015

beforeSend: function(block){
//分片验证是否已传过,用于断点续传
var task = new $.Deferred();
// var owner = this.owner;
(new WebUploader.Uploader()).md5File(block.blob).progress(function(percentage){
console.log(percentage);
}).then(function(val){
// owner.options.formData.md5 = val;
// userInfo.md5 = val;
// md5 = val;
// block.chunkMd5 = val;
// console.log("chunkcheck md5:"+val);
$.ajax({
type: "POST",
dataType:"text/json",
// url: backEndUrl ,
url: "http://localhost:8080/clouddisk/admin/files/chunkCheck",
data: {
status: "chunkCheck",
chunkIndex: block.chunk,
size: block.end - block.start,
md5: val
}
, cache: false
, timeout: 1000 //todo 超时的话,只能认为该分片未上传过
, dataType: "json"
}).then(function(data, textStatus, jqXHR){
console.log("chunkCheck:"+data.md5);
if(data.md5!=''){ //若存在,返回失败给WebUploader,表明该分块不需要上传
console.log("skip");
task.reject();
}else{
console.log("noskip");
task.resolve();
}
}, function(jqXHR, textStatus, errorThrown){ //任何形式的验证失败,都触发重新上传
task.resolve();
});
return $.when(task);

                   });
            }

为什么我的代码执行到task.reject()不跳过分片,继续执行后面的上传分页的程序????

@fengjianjunstudy
Copy link

@2betop 如何实现断点续传,传到一半的时候,断网了,网络恢复正常以后,手动触发继续上传,如何接着原来断开之处继续上传

@fengjianjunstudy
Copy link

@2betop 网络异常的情况下,分片重试三次,3次以后彻底失败,网络恢复正常以后我手动触发上传,uploader.upload()
没有作用

@yinxiaoliang
Copy link

yinxiaoliang commented Sep 24, 2016

@beyondonly
owner.md5File(block.blob) 分片指定start, end

`WebUploader.Uploader.register({
'before-send': 'checkchunk'
}, {
checkchunk: function( block ) {
var deferred = WebUploader.Deferred();
var me = this, owner = this.owner;

        owner.md5File(block.blob,block.start, block.end)            
        .fail(function() {// 如果读取出错了,则通过reject告诉webuploader文件上传出错。
            deferred.reject();
        })           
        .then(function( md5 ) { // md5值计算完成
            // 与服务安验证
            $.ajax(owner.options.md5Server, {
                dataType: 'json',
                data: {
                    chunk: block.chunk,
                    chunks : block.chunks,
                    start: block.start,
                    end:   block.end,
                    total: block.total,
                    uid: owner.options.formData.uid,
                    md5: md5
                },
                success: function( response ) {
                    // 如果验证已经上传过
                    if ( response.exist ) {
                        deferred.reject();
                        console.log('分片已传,跳过');
                    }else{
                         deferred.resolve();
                    }

                }
            });
        });
        return deferred.promise();
    }
});`

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

7 participants