作为程序员一定要保持良好的睡眠,才能好编程

webUploader使用教程笔记

发布时间:2019-08-20

 项目中使用到了上传类,那么如何异步多文件上传呢?

这里考虑到了使用webUploader来做,怎么使用呢,现在看看代码:


API:http://fex.baidu.com/webuploader/doc/index.html#WebUploader_Uploader_getFiles


以上可以打开查看帮助文档:


好了,那么看看代码中是如何使用的:


<link href="__ADMIN__/lib/webuploader/0.1.5/webuploader.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="__ADMIN__/lib/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="__ADMIN__/lib/webuploader/0.1.5/webuploader.min.js"></script>

首先引入上面的两个文件和jquery,然后编写html文件

<div class="uploader-list-container">
    <div class="queueList">
        <div id="dndArea" class="placeholder">
            <div id="filePicker-2"></div>
            <p>或将文件拖到这里,单次最多可选300文件</p>
        </div>
    </div>
    <div class="statusBar" style="display:none;">
        <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div>
        <div class="info"></div>
        <div class="btns">
            <div id="filePicker2"></div>
            <div class="uploadBtn">开始上传</div>
        </div>
    </div>
</div>


JS代码:

var uploader = WebUploader.create({
    swf: '__ADMIN__/lib/webuploader/0.1.5/Uploader.swf',
    // 开起分片上传。
    chunked: true,
    //绑定到的按钮
    pick: {
        id: '#filePicker-2',
        label: '点击选择文件'
    },
    //每次上传都带有一个参数
    formData: {
        uid: 123
    },
    // 自动上传。
    auto: true,
    // 文件接收服务端。
    server: '/doUpload.do',

    // [默认值:'file']  设置文件上传域的name。
    fileVal:'file',

    dnd: '#dndArea', //拖拽的区域,如果不指定,则不启动
});

通过上面的几个步骤,就已经可以看到效果了,如图:

2.png


好的,看到效果了,那么我把一些API的参数也放在下面,方便填写使用:





  •                dnd                 {Selector}                 [可选]                 [默认值:undefined]            

    指定Drag And Drop拖拽的容器,如果不指定,则不启动。

  •                disableGlobalDnd                 {Selector}                 [可选]                 [默认值:false]            

    是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。

  •                paste                 {Selector}                 [可选]                 [默认值:undefined]            

    指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为document.body.

  •                pick                 {Selector, Object}                 [可选]                 [默认值:undefined]            

    指定选择文件的按钮容器,不指定则不创建按钮。

    • id {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。注意 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。

    • label {String} 请采用 innerHTML 代替

    • innerHTML {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。

    • multiple {Boolean} 是否开起同时选择多个文件能力。

  •                accept                 {Arroy}                 [可选]                 [默认值:null]            

    指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。

    • title {String} 文字描述

    • extensions {String} 允许的文件后缀,不带点,多个用逗号分割。

    • mimeTypes {String} 多个用逗号分割。

  •                auto                 {Boolean}                 [可选]                 [默认值:false]            

    设置为 true 后,不需要手动调用上传,有文件选择即开始上传。

  •                runtimeOrder                 {Object}                 [可选]                 [默认值:html5,flash]            

    指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.

    可以将此值设置成 flash,来强制使用 flash 运行时。

  •                prepareNextFile                 {Boolean}                 [可选]                 [默认值:false]            

    是否允许在文件传输时提前把下一个文件准备好。 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 如果能提前在当前文件传输期处理,可以节省总体耗时。

  •                chunked                 {Boolean}                 [可选]                 [默认值:false]            

    是否要分片处理大文件上传。

  •                chunkSize                 {Boolean}                 [可选]                 [默认值:5242880]            

    如果要分片,分多大一片? 默认大小为5M.

  •                chunkRetry                 {Boolean}                 [可选]                 [默认值:2]            

    如果某个分片由于网络问题出错,允许自动重传多少次?

  •                threads                 {Boolean}                 [可选]                 [默认值:3]            

    上传并发数。允许同时最大上传进程数。

  •                formData                 {Object}                 [可选]                 [默认值:{}]            

    文件上传请求的参数表,每次发送都会发送此对象中的参数。

  •                fileVal                 {Object}                 [可选]                 [默认值:'file']            

    设置文件上传域的name。

  •                method                 {Object}                 [可选]                 [默认值:'POST']            

    文件上传方式,POST或者GET

  •                sendAsBinary                 {Object}                 [可选]                 [默认值:false]            

    是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容, 其他参数在$_GET数组中。

  •                fileNumLimit                 {int}                 [可选]                 [默认值:undefined]            

    验证文件总数量, 超出则不允许加入队列。

  •                fileSizeLimit                 {int}                 [可选]                 [默认值:undefined]            

    验证文件总大小是否超出限制, 超出则不允许加入队列。

  •                fileSingleSizeLimit                 {int}                 [可选]                 [默认值:undefined]            

    验证单个文件大小是否超出限制, 超出则不允许加入队列。

  •                duplicate                 {Boolean}                 [可选]                 [默认值:undefined]            

    去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.

  •                disableWidgets                 {String, Array}                 [可选]                 [默认值:undefined]            

    默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。


事件说明

看看常用的触发事件就可以了


事件名参数说明描述
dndAccept
  • items {DataTransferItemList}

    DataTransferItem

阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。

beforeFileQueued
  • file {File}

    File对象

当文件被加入队列之前触发,此事件的handler返回值为false,则此文件不会被添加进入队列。

fileQueued
  • file {File}

    File对象

当文件被加入队列以后触发。

filesQueued
  • files {File}

    数组,内容为原始File(lib/File)对象。

当一批文件添加进队列以后触发。

fileDequeued
  • file {File}

    File对象

当文件被移除队列后触发。

reset

当 uploader 被重置的时候触发。

startUpload

当开始上传流程时触发。

stopUpload

当开始上传流程暂停时触发。

uploadFinished

当所有文件上传结束时触发。

uploadStart
  • file {File}

    File对象

某个文件开始上传前触发,一个文件只会触发一次。

uploadBeforeSend
  • object {Object}

  • data {Object}

    默认的上传参数,可以扩展此对象来控制上传参数。

  • headers {Object}

    可以扩展此对象来控制上传头部。

当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。

uploadAccept
  • object {Object}

  • ret {Object}

    服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。

当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为false, 则此文件将派送server类型的uploadError事件。

uploadProgress
  • file {File}

    File对象

  • percentage {Number}

    上传进度

上传过程中触发,携带上传进度。

uploadError
  • file {File}

    File对象

  • reason {String}

    出错的code

当文件上传出错时触发。

uploadSuccess
  • file {File}

    File对象

  • response {Object}

    服务端返回的数据

当文件上传成功时触发。

uploadComplete
  • file {File} [可选]

    File对象

不管成功或者失败,文件上传完成时触发。

error
  • type {String}

    错误类型。

当validate不通过时,会以派送错误事件的形式通知调用者。通过upload.on('error', handler)可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。

  • Q_EXCEED_NUM_LIMIT 在设置了fileNumLimit且尝试给uploader添加的文件数量超出这个值时派送。

  • Q_EXCEED_SIZE_LIMIT 在设置了Q_EXCEED_SIZE_LIMIT且尝试给uploader添加的文件总大小超出这个值时派送。

  • Q_TYPE_DENIED 当文件类型不满足时触发。。


另外还有一个 all  监听:


//开始上传
$(".uploadBtn").on('click', function() {

    if ( $(this).hasClass( 'disabled' ) ) {
        return false;
    }
    //判断是否选择了一个目录 如果是 则上传,否则提醒用户进行选择


    if ( state === 'ready' ) {
        uploader.upload();
    } else if ( state === 'paused' ) {
        uploader.upload();
    } else if ( state === 'uploading' ) {
        uploader.stop();
    }
});

//监听all 凡是触发的函数,这里都会走这个监听。
uploader.on( 'all', function( type ) {
    var stats;
    switch( type ) {
        case 'uploadFinished':
            setState( 'confirm' );
            break;
        case 'startUpload':
            setState( 'uploading' );
            break;
        case 'stopUpload':
            setState( 'paused' );
            break;
    }
});




这类参数的使用,主要集中在几个重要的方法上,那么我们来看看,用到了哪些?


var fileName=file.name;       //当前文件的名称

fileSize=file.size;                                           //每个文件的大小总和

WebUploader.formatSize(fileSize)                  //得到做文件的大小


uploader.upload() //开始上传


uploader.stop()  //停止


else if ( state === 'confirm' ) {
                stats = uploader.getStats();
                if ( stats.uploadFailNum ) {
                    text = '已成功上传' + stats.successNum+ '个文件,'+
                            stats.uploadFailNum + '文件上传失败,<a class="retry" href="#">重新上传</a>失败文件或<a class="ignore" href="#">忽略</a>'
                }
            }else{
                stats = uploader.getStats();
                text = '共' + fileCount + '个文件(' +
                        WebUploader.formatSize( fileSize )  +
                        '),已上传' + stats.successNum + '个文件';
                if ( stats.uploadFailNum ) {
                    text += ',失败' + stats.uploadFailNum + '个文件';
                }
            }




uploader.addButton({

    id:"#filePicker2",

    label:"继续添加"

});




来点干货:


发送表单数据到服务器:


image.png


带有header头的方式请求

var uploader = WebUploader.create({
    swf: static_url + '/lib/webuploader/0.1.5/Uploader.swf',

    // 开起分片上传。
    chunked: true,
    //绑定到的按钮
    pick: {
        id: '#filePicker-2',
        label: '点击选择文件'
    },
    //上传到服务的值
    formData: {
        'upType': 'thumb'
    },
    multiple: true, //可以选择多个文件

    // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
    resize: false,
    // 自动上传。
    auto: false,
    
    isRealTimeDelete:false,
    // 文件接收服务端。
    server: apihost + uploadPath,

    // [默认值:'file']  设置文件上传域的name。
    fileVal: 'uploadFile',

    accept: {
        //title: 'Images',
        extensions: 'gif,jpg,jpeg,bmp,png',
        mimeTypes: 'image/*'
    },
    server: root +'file/uploadPic',		// 上传文件接口
    deleteServer:'',					// 删除文件接口
    md5Server:'',						// md5秒传验证接口
    isRealTimeDelete:false,				// 删除已上传的文件,是否需要实时删除,true则需要提供删除文件接口
    duplicate :true, //去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.

    dnd: '#dndArea' //拖拽的区域,如果不指定,则不启动
});












/**
 * 请求之前 封装headers信息
 */
uploader.on('uploadBeforeSend', function (obj, data, headers) {

    jQuery.extend(headers, {
        "X-Access-Token": projectCommon.getToken(),
        "Env": projectCommon.config.env,
        "X-Requested-With": 'xmlhttprequest'
    });


});



//当某个文件上传成功后,触发的一个事件
uploader.on("uploadSuccess", function (file, response) {
    //var fileInfo=object.file;
    // console.log(file);
    // console.log(response);
    if (!isUndefined(response.result.id)) {
        $('.filelist #' + response.result.id).attr('alt', response.result.path);
    }
    //alert(object.message+"-------"+object.source_filename);

});



// 当文件被加入队列之前触发,此事件的handler返回值为false,则此文件不会被添加进入队列。
   uploader.on( 'beforeFileQueued', function( file ) {
    // 限制图片数量
    img_length = $("#thelist img").length;
    if (img_length >= 6) {
    layer.msg("图片最多上传6张");
    return false;
    }
 
   });



// 文件上传失败,显示上传出错。
   uploader.on( 'uploadError', function( file ) {
    var $li = $( '#'+file.id ),
     $error = $li.find('div.error');
    // 避免重复创建
    if ( !$error.length ) {
     $error = $('<div class="error"></div>').appendTo( $li );
    }
    $error.html('<font color="red">上传失败</font>');
   });


帮助文档

http://fex.baidu.com/webuploader/doc/#WebUploader_File



https://www.cnblogs.com/wisdo/p/6159761.html