最简单调用

例子

必须从服务器端浏览demo,demo中使用的服务器端脚本是php。

选择要上传的文件

html结构

                    
                     选择要上传的文件 
                    
                    

非常简单的html结构,一个上传按钮(必须)和一个文件队列(可以不存在)。

生成的dom结构

ajax上传方案(chrome/firefox)

                    
                        选择要上传的文件
                        

flash上传方案(IE)

                    
                        选择要上传的文件
                        

javascript代码

配置下gallery的包路径

                    KISSY.config({
                        packages:[ {
                            name:"gallery",
                            path:"http://a.tbcdn.cn/s/kissy/",
                            charset:"utf-8"
                        } ]
                    });
                

初始化上传组件

                KISSY.use('gallery/form/1.3/uploader/index', function (S, RenderUploader) {
                    new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{
                        //服务器端配置
                        serverConfig:{
                            //处理上传的服务器端脚本路径
                            action:"upload.php"
                        },
                        // 文件域
                        name:"Filedata",
                        //用于放服务器端返回的url的隐藏域
                        urlsInputName:"fileUrls"
                    });
                })
                

配置参数说明

参数名 类型 默认值 描述
serverConfig Object {action:'', data:{}, dataType:'json'} 服务器端配置,包括最重要的action(路径)配置,data为post到服务器端数据
name String Filedata 文件上传域name名,组件会根据这个name值生成一个文件上传input(type="file")
urlsInputName String '' 用于存放服务器端返回的文件路径的input(type="hidden")
PS: 这三个配置是最核心的配置,一般是必不可少,更多的接口说明请看API doc,后面将逐步介绍更多API。

与服务器端的交互

服务器端处理异步上传跟同步上传没太大区别,核心的操作是获取前端post到服务器端的数据,比如前端post的文件域name为Filedata,服务器端处理Filedata内的文件数据即可。

服务器端处理完上传(无论是成功还是失败),需要返回一个json结果集,格式如下:

上传成功时
                    {"status":1,"data":{"name":"minghe.jpg","url":"www.36ria.com/minghe.jpg"}}
                
上传失败时
                   {"status":0,"message":"图片过大!"}
                
PS:留意引号!!!特别是键名要加"",不然json会解析失败。
PS:"status":1,才是上传成功的标识,其他任何状态码都认定为失败。

demo php可以看 源码

PS:文件上传成功后,组件会自动提取url放进urlsInputName配置的隐藏域内。

动态修改post到服务器端的数据

前面的demo,我们通过配置serverConfig来控制post到服务器端的数据,比如下面的代码:

KISSY.use('gallery/form/1.3/uploader/index', function (S, RenderUploader) {
    var ru = new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{
        serverConfig:{
            action:"upload.php",
            data:{userName:"minghe",email:"minghe36@126.com"}
        },
        name:"Filedata",
        urlsInputName:"fileUrls"
    });
})

有时我们希望data参数是可以通过脚本动态配置,可以这么处理:

ru.on('init',function(ev){
    var uploader = ev.uploader;
    uploader.set('data',{userName:"ziying",email:"daxingplay@gmail.com"})
})

通过setdata属性值来动态修改post到服务器端数据。

IE下上传flash跨域处理

如果你在使用uploader中遇到IE下进度条不走的情况,多半的原因是由于在域名根目录下没有放跨域策略文件crossdomain.xml导致的。

PS:IE下是使用flash上传,依赖于flash的安全策略crossdomain.xml

以淘宝网的跨域策略为例:

            
            
                 
                
                
                
                
            
        

tbcdn.cn为swf文件所在的位置,安全策略文件需要加上。

当不存在crossdomain.xml文件时,控制台会打印错误消息,比如:

上传成功后,会打印服务器返回的json数据,比如:

异步上传的验证

增加authConfig配置

                    new RenderUploader('#J_UploaderAuthBtn', '#J_UploaderAuthQueue', {
                        serverConfig:{ action:"upload.php" },
                        name:"Filedata",
                        urlsInputName:"fileUrls",
                        //验证配置
                        authConfig: {
                            require:[true,"必须至少上传一个文件!"],
                            max:[3, "最多上传{max}个文件!"],
                            maxSize:[1000, "文件大小为{size},文件太大!"],
                            allowRepeat:[false, "该文件已经存在!"],
                            allowExts:[
                                {"desc":"JPG,JPEG,PNG,GIF,BMP", "ext":"*.jpg;*.jpeg;*.png;*.gif;*.bmp"},
                                "不支持{ext}格式的文件上传!"
                            ]
                        }
                    });
                

支持的验证规则

每一项规则的值都必须为一个数组,数组的一个值为规则控制,第二个值为规则验证文案,比如max:[3, "每次最多上传{max}个文件!"]
规则名 举例 描述
require [true,"必须至少上传一个文件!"] 必须至少上传一个文件
上传必须性,默认不打印消息
max [3, "最多上传{max}个文件!"] 最多上传3个文件,当达到3个文件后按钮会增加禁用样式uploader-button-disabled,用户可以通过这个样式名定制需要的置灰样式。
不推荐隐藏按钮,不可隐藏按钮的父容器。
maxSize [1000, "文件大小为{size},文件太大!"] 单文件最大允许上传的文件大小,单位是KB
如果是iframe上传方式,此验证无效
allowRepeat [false, "该文件已经存在!"] 是否允许多次上传同一个文件
不推荐增加这个验证,比较粗糙,只是根据文件名来做重复判断
allowExts [ {"desc":"JPG,JPEG,PNG,GIF,BMP", "ext":"*.jpg;*.jpeg;*.png;*.gif;*.bmp"}, "不支持{ext}格式的文件上传!" ] 非常常用的文件格式验证,基本上每个上传都会用到
留意:数组第一个值是个object,desc为文件格式描述,只在IE(flash)下起作用。ext才是真正的文件过滤规则。

监听error事件

监听uploader的error事件即可(V1.2.6),比如下面的代码:

        uploader.on('error', function (ev) {
            var rule = ev.rule, msg = ev.msg,status = ev.status;
            if (rule == 'max') {
                alert(msg);
            }
            if(status === -1){
                alert('前端验证错误');
            }
        });
        

试下demo上传三个文件会出现弹出框提示

手动触发验证

有时我们需要额外调用验证方法,比如提交表单时验证下是不是有至少有一个文件上传。

        $('#J_SubmitAuthDemo').on('click', function (ev) {
            var auth = uploader.get('auth');
            var isPass = auth.testRequire();
            if (isPass) {
                alert('存在上传文件!');
            }else{
                alert('请至少上传一个文件!');
            }
        })
        

先要获取Auth实例,然后调用testRequire()方法。

testMax()可以检验是否达到最大允许上传数。

使用不同的上传主题

示例

以使用imageUploader(图片上传)主题为例

主题html结构如下:

          
        

增加theme配置项

        new RenderUploader('#J_ImageUploaderBtn', '#J_ImageUploaderQueue', {
            theme:"imageUploader",
            urlsInputName:"imgUrlsInput",
            serverConfig:{"action":"./upload.php", "data":{"iid":77010, "fieldId":132338}},
            name:"Filedata",
            authConfig:{
                require:[true, "必须至少上传一个文件!"],
                maxSize:[500, "文件大小为{size},文件太大!"],
                allowExts:[
                    {"desc":"JPG,JPEG,PNG,GIF,BMP", "ext":"*.jpg;*.jpeg;*.png;*.gif;*.bmp"},
                    "文件格式错误!"
                ],
                max:[5, "最多允许上传五张图片!"]
            }
        });
        

theme:"imageUploader"使用uploader内置图片上传主题imageUploader,此主题会获取服务器返回的url,显示在页面。

imageUploader肯定无法100%满足实际的场景,这时候你可以制作自己的主题,请看《如何制作属于自己的主题(上、下)》,还可以监听uploader的事件做些额外的逻辑处理(但没办法覆盖主题的逻辑)。

如果自制主题,theme参数应该制定模块完整路径,比如theme:"gallery/form/1.3/uploader/themes/imageUploader"

如何自定义主题样式?

使用主题时,会额外加载主题的style.css,由于是异步加载的,样式优先级会比较高。

不加载主题样式,可以如下处理

        new RenderUploader('#J_ImageUploaderBtn', '#J_ImageUploaderQueue', {
            theme:"imageUploader",
            themeConfig:{
                cssUrl:''
            }
        });
        

如何改变主题的模板?

        new RenderUploader('#J_ImageUploaderBtn', '#J_ImageUploaderQueue', {
            theme:"imageUploader",
            themeConfig:{
                fileTpl:
                    '
  • ' + '
    ' + '' + '
    ' + '
    ' + '
    ' + '

    等待上传,请稍候

    ' + '
    ' + '
    上传中...
    ' + '
    ' + '
    ' + '

    上传失败,请重试!

    ' + '
    ' + '删除' + '
  • ' } });
    欢迎大家提交自己的主题到uploader内。

    默认数据展现

    在实际应用中通常会有个需求:用户已经上传了三张图片,然后保存,那么用户再进入这个页面时,应该如何展示这三张图片呢?

    这里有个难点,我们需要把图片插入到组件的队列中,这样文件数的统计、删除等行为才是一致的。

    示例

    选择要上传的文件

    服务器端在页面中打印如下数据:

            
            

    为一个array,文件数据为object,结构跟队列中的file数据保持一致,所以看上去数据有些繁冗。

    初始化时增加restoreHook配置项

              new RenderUploader('#J_RestoreUploaderBtn', '#J_RestoreUploaderQueue', {
                    serverConfig:{ action:"upload.php" },
                    name:"Filedata",
                    urlsInputName:"fileUrls",
                    restoreHook:"#J_UploaderRestore"
              });
            

    好了,组件会自动将数据插入到queue中,并渲染出图片。

    button(按钮实例)控制

    示例

    选择要上传的文件

    初始化组件

            var ru = new RenderUploader('#J_ButtonUploaderBtn', '#J_ButtonUploaderQueue',{
                serverConfig:{"action":"upload.php"},
                name:"Filedata",
                urlsInputName:"fileUrls",
                autoUpload: false,
                multiple:false,
                disabled:true
            });
            

    配置说明

    参数名 类型 默认值 描述
    autoUpload Boolean true 是否自动上传,当为false时,可以通过uploader的upload()uploadFiles()手动上传队列中的文件。
    multiple Boolean true 是否开启多选支持
    如果采用iframe上传,请设置为false
    disabled Boolean false 是否可用,false为按钮可用

    通过设置uploader属性控制按钮

            //对组件的后续操作务必放在init事件内,因为组件时可能需要异步加载模板
            ru.on("init", function (ev) {
                var uploader = ev.uploader;
                $('#J_Disabled').on('change',function(ev){
                    var isChecked = $(ev.target).prop('checked');
                    uploader.set('disabled',isChecked);
                });
                $('#J_Multiple').on('change',function(ev){
                    var isChecked = $(ev.target).prop('checked');
                    uploader.set('multiple',isChecked);
                });
                $('#J_UploadAll').on('click',function(){
                    uploader.uploadFiles();
                })
            })
            
    PS:对组件的后续操作务必放在init事件监听器内

    queue(队列实例)控制

    queue的详细API请看文档

    示例

    选择要上传的文件

    想要操作队列,就必须先获取queue实例(为uploader的属性),比如下面的代码:

            //uploaderQueueTest为RenderUploader的实例
            uploaderQueueTest.on('init',function(ev){
               var uploader = ev.uploader,
                       queue = uploader.get('queue');
            })
            

    下面举例说明常用的方法和属性。

    add():向队列添加文件

                   $('#J_Add').on('click', function (ev) {
                    //测试文件数据
                    var testFile = {'name':'test.jpg',
                        'size':2000,
                        'input':{},
                        'file':{'name':'test.jpg', 'type':'image/jpeg', 'size':2000}
                    };
                    //向队列添加文件
                    var file = queue.add(testFile);
                    S.log('添加的文件数据为:'+file);
                });
            

    remove():删除队列中的文件

                   $('#J_DelFirst').on('click', function (ev) {
                        var removeFile = queue.remove(0);
                        S.log('删除的文件数据为:'+removeFile);
                    });
            
    留意remove()的参数可以是队列数组的索引,比如上面代码的0,是取队列第一个文件数据;也可以是文件的id(唯一),比如remove('file-26')

    fileStatus(index, status, args):改变文件状态

    默认的主题共有以下文件状态:'waiting'、'start'、'progress'、'success'、'cancel'、'error'

    不同的主题拥有的状态情况可能存在差异。

               $('#J_ChangeStatus').on('click', function (ev) {
                    queue.fileStatus(0, 'success');
                });
            

    clear():删除队列内的所有文件

               $('#J_Clear').on('click', function (ev) {
                queue.clear();
                });
            

    files:通过该属性可以获取队列中所有的文件数据

                   $('#J_GetAll').on('click', function (ev) {
                        var ids = [],
                                files = queue.get('files');
                        S.each(files, function (file) {
                            ids.push(file.id);
                        });
                        alert('所有文件id:' + ids);
                    });
            

    getFiles(type):获取指定状态下的文件

               $('#J_GetStatusFileIds').on('click', function (ev) {
                    var files = queue.getFiles('waiting'),
                            ids = [];
                    S.each(files, function (file) {
                        ids.push(file.id);
                    });
                    alert('所有等待中的文件id为:' + ids);
                });
            

    getIndexs(type):获取等指定状态的文件对应的文件数组索引值组成的数组

    getFiles()和getFileIds()的作用是不同的,getFiles()类似过滤数组,获取的是指定状态的文件数据,而getFileIds()只是获取指定状态下的文件对应的在文件数组内的索引值。

               $('#J_GetStatusFilesIndex').on('click', function () {
                    var indexs = queue.getIndexs('waiting');
                    alert('所有等待中的文件index为:' + indexs);
                })
            

    uploader常用接口

    uploader的详细API请看文档

    uploader常用属性/配置

    uploader的配置都会写入成uploader的属性内。uploader的几个关键配置前面都有提到了,这里做个汇总。

    属性名 类型 默认值 是否只读 描述
    type String|Array "auto" 只读 采用的上传方案,当值是数组时,比如“type” : ["flash","ajax","iframe"],按顺序获取浏览器支持的方式,该配置会优先使用flash上传方式,如果浏览器不支持flash,会降级为ajax,如果还不支持ajax,会降级为iframe;当值是字符串时,比如“type” : “ajax”,表示只使用ajax上传方式。这种方式比较极端,在不支持ajax上传方式的浏览器会不可用;
    当“type” : “auto”,auto是一种特例,等价于["ajax","flash","iframe"]。
    不再推荐配置type,除非在使用flash时遇到难以解决的问题。
    curUploadIndex Number "" 只读 当前上传的文件对应的在数组内的索引值,如果没有文件正在上传,值为空
    isAllowUpload Boolean true 只读 是否允许上传文件
    isAllowUpload Boolean true 读/写 是否允许上传文件,当文件正在上传时,isAllowUpload为false
    queue Queue '' 只读 Queue队列的实例,想要对队列进行操作或监听队列的事件,就必须先获取这个属性
    restoreHook String '' 只读 已经存在的文件数据待提取的容器钩子,用法请看默认数据展现
    autoUpload Boolean true 读/写 是否自动上传,当为false时,可以通过uploader的upload()uploadFiles()手动上传队列中的文件。
    multiple Boolean true 读/写 是否开启多选支持
    如果采用iframe上传,请设置为false
    multipleLen Number -1 读/写 用于限制多选文件个数,值为负时不设置多选限制(v1.2.6+)
    disabled Boolean false 读/写 是否可用,false为按钮可用
    serverConfig Object {action:'', data:{}, dataType:'json'} 读/写 服务器端配置,包括最重要的action(路径)配置,data为post到服务器端数据
    data Object {} 读/写 此配置用于动态修改post给服务器的数据,会覆盖serverConfig的data配置(v1.2.6+)
    name String Filedata 只读 文件上传域name名,组件会根据这个name值生成一个文件上传input(type="file")
    urlsInputName String '' 只读 用于存放服务器端返回的文件路径的input(type="hidden")

    uploader常用方法

    upload (index)

    上传指定队列索引的文件。

    //上传队列中的第一个文件,uploader为Uploader的实例
    uploader.upload(0)
    

    uploadFiles (status)

    批量上传队列中的指定状态下的文件。

    //上传队列中所有等待的文件
    uploader.uploadFiles("waiting")
    

    cancel (index)

    取消文件上传,当index参数不存在时取消当前正在上传的文件的上传。cancel并不会停止其他文件的上传(对应方法是stop)。

    //取消当前正在上传的文件的上传
    uploader.cancel();
    

    stop()

    停止上传动作

            //停止上传
            uploader.stop();
            

    uploader常用事件

    事件名 描述
    select 选择完文件后触发
    start 开始上传后触发
    progress 正在上传中时触发,这个事件在iframe上传方式中不存在
    success 上传成功后触发
    error 上传失败后触发
    cancel 取消上传后触发

    关于插件