小白系列之WebUploader文件上传+断点续传

百度的WebUpLoader控件是比较好用的一款web文件上传控件,只是用法上官网写的并不能让小白们有眼前一亮的感觉,我在项目中用到了,顺便便贴出来给小伙伴们一个参考,如有错误,还请各位不吝赐教,多多指正。 官网API地址:http://fex.baidu.com/webuploader/doc/#WebUploader_Uploader_events整体代码逻辑思路1.文件唯一性验...
摘要由CSDN通过智能技术生成

百度的WebUpLoader控件是比较好用的一款web文件上传控件,只是用法上官网写的并不能让小白们有眼前一亮的感觉,我在项目中用到了,顺便便贴出来给小伙伴们一个参考,如有错误,还请各位不吝赐教,多多指正。
官网API地址:http://fex.baidu.com/webuploader/doc/#WebUploader_Uploader_events

整体代码逻辑思路

1.文件唯一性验证
2.分块上传之前进行分块验证
3.分块上传,后台接收
4.上传完成,进行分块合并
5.取消文件上传处理

前端代码

Web前端需要引用js,swf
1.文件唯一性验证
文件上传前获取文件MD5值,文件断点续传的时候可以确定文件的唯一性,(由于有些文件可能会比较大,可以设置验证大小,缩短验证时间)

/**
 * 模块-上传文件核心
 */
define(['jquery', 'webuploader'], function ($, WebUploader) {
    return {
        //初始化核心上传组件
        init: function (config) {
            //系统中上传文件的参数()
            var getFolderPath = config.getFolderPath;
            var getProjectNodeId = config.getProjectNodeId;
            var getSourceId = config.getSourceId;
            var sourceName = config.sourceName;
            var getIsOuter = config.getIsOuter;
            var serverUrl = config.serverUrl;
            var callback = config.callback;
            var uploader;//上传组件对象
            //WebUploader插件初始化--------------------------------------------------------
            $(document).ready(function () {
                //初始化参数
                var $ = jQuery,
                    $list = $('#thelist'),//文件列表
                    $btn = $('#ctlBtn'),//开始上传按钮
                    state = 'pending';//分块上传状态
                /******************下面的参数是自定义的*************************/
                var fileMd5;
                var count = 0;//当前正在上传的文件在数组中的下标,一次上传多个文件时使用
                var filesArr = new Array();//文件数组:每当有文件被添加进队列的时候 就push到数组中
                //重写插件方法
                WebUploader.Uploader.register({
                    "before-send-file": "beforeSendFile",//整个文件上传前
                    "before-send": "beforeSend",  //每个分片上传前 
                }, {
                        //时间点1:所有分块进行上传之前调用此函数  
                        beforeSendFile: function (file) {
                            //创建一个异步对象
                            var deferred = WebUploader.Deferred();
                            (new WebUploader.Uploader()).md5File(file, 0, 10 * 1024 * 1024)
                                .progress(function (percentage) {
                                    $('#' + file.id).find('p.state').text('正在读取文件信息...');
                                })
                                .then(function (val) {
                                    $('#' + file.id).find("p.state").text("成功获取文件信息...");
                                    fileMd5 = val
                                    //添加参数---文件路径
                                    uploader.option('formData', {
                                        md5: val
                                    })
                                    //获取文件信息后进入下一步  
                                    deferred.resolve();
                                });
                            return deferred.promise();
                        },
                        //时间点2:如果有分块上传,则每个分块上传之前调用此函数    
                        beforeSend: function (block) {
                            var deferred = WebUploader.Deferred();
                            var folderPath = $('.fpath:eq(0)').text()
                            $.ajax({
                                type: "POST",
                                url: "/CRM/FileManage/CheckFileChunk",  //ajax验证每一个分片  
                                data: {
                                    folderPath: folderPath + "/" + $('input[name="filetype"]:checked').val(),//区分内外部文件
                                    md5: fileMd5,  //文件唯一标记    
                                    chunk: block.chunk,  //当前分块下标    
                                    chunkSize: block.end - block.start//当前分块大小    
                                },
                                cache: false,
                                async: false,  // 与js同步  
                                timeout: 1000, //todo 超时的话,只能认为该分片未上传过  
                                dataType: "json",
                                success: function (response) {
                                    if (response.result == 1) {
                                        //分块存在,跳过  
                                        deferred.reject();
                                    } else {
                                        //分块不存在或不完整,重新发送该分块内容    
                                        deferred.resolve();
                                    }
                                }
                            });
                            this.owner.options.formData.fileMd5 = fileMd5;
                            deferred.resolve();
                            return deferred.promise();
                        }
                    });
                //实例化上传插件--------------------------------------------------------------------------
                uploader = WebUploader.create({
                    auto: false,//选择文件后是否自动上传
                    swf: '/CommonResource/scripts/Uploader.swf',
                    server: "/CRM/FileManage/UploadFile",
                    pick: '#picker',
                    formData: {
                        folderPath: '',
                        md5: '',
                        projectNodeId: '',
                        sourceId: ''
                    },
                    chunked: true,//开启分片上传
                    chunkSize: 5 * 1024 * 1024,// 如果要分片,分多大一片?默认大小为5M
                    chunkRetry: 3,//如果某个分片由于网络问题出错,允许自动重传多少次
                    prepareNextFile: true,//上传当前分片时预处理下一分片 
                    threads: 3,//上传并发数。允许同时最大上传进程数[默认值:3]
                    duplicate: false,//是否重复上传(同时选择多个一样的文件),true可以重复上传
                    fileSizeLimit: 6 * 1024 * 1024 * 1024,//6G 验证文件总大小是否超出限制, 超出则不允许加入队列
                    fileSingleSizeLimit: 3 * 1024 * 1024 * 1024,  //3G 验证单个文件大小是否超出限制, 超出则不允许加入队列
                    pick: {
                        id: '#picker', //这个id是你要点击上传文件按钮的外层div的id
                        multiple: false //是否可以批量上传,true可以同时选择多个文件
                    },
                    resize: false,//不压缩image, 默认如果是jpeg,文件上传前会先压缩再上传!
                    //accept: {  
                    //    //允许上传的文件后缀,不带点ÿ
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值