• angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传


    step1:引入文件

    • 引入Plupload *
      该SDK上传功能集于Plupload插件封装,所以需要下载Plupload; plupload.dev.js

    • 引入qiniu.js
      为了简便,当时直接从官网示例中复制的js文件

    • 引入moxie.js
      因为Plupload插件除了能解决h5的上传问题,还能上传flash等,所以需要该文件。本来我们是不需要的,但由于plupload.dev.js和qiniu.js里面有依赖于moxie.js的代码,如果不引入,就一直报错:moxie not defined,挺头疼的,索性一并引入了

    因为互相依赖,所以引入的顺序也很重要,先是moxie.js => plupload.dev.js => qiniu.js => index.js

    step2:查看七牛云api,相关参数配置(七牛云开发者中心)

    var uploader = Qiniu.uploader({
        runtimes: 'html5,flash,html4',      // 上传模式,依次退化
        browse_button: 'pickfiles',         // 上传选择的点选按钮ID,必需
        // 在初始化时,uptoken,uptoken_url,uptoken_func三个参数中必须有一个被设置
        // 且如果提供了多个,其优先级为uptoken > uptoken_url > uptoken_func
        // 其中uptoken是直接提供上传凭证,uptoken_url是提供了获取上传凭证的地址,如果需要定制获取uptoken的过程则可以设置uptoken_func
        // uptoken : '<Your upload token>', // uptoken是上传凭证,由其他程序生成
        // uptoken_url: '/uptoken',         // Ajax请求uptoken的Url,强烈建议设置(服务端提供)
        // uptoken_func: function(file){    // 在需要获取uptoken时,该方法会被调用
        //    // do something
        //    return uptoken;
        // },
        get_new_uptoken: false,             // 设置上传文件的时候是否每次都重新获取新的uptoken
        // downtoken_url: '/downtoken',
        // Ajax请求downToken的Url,私有空间时使用,JS-SDK将向该地址POST文件的key和domain,服务端返回的JSON必须包含url字段,url值为该文件的下载地址
        // unique_names: true,              // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名)
        // save_key: true,                  // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理
        domain: '<Your bucket domain>',     // bucket域名,下载资源时用到,必需
        container: 'container',             // 上传区域DOM ID,默认是browser_button的父元素
        max_file_size: '100mb',             // 最大文件体积限制
        flash_swf_url: 'path/of/plupload/Moxie.swf',  //引入flash,相对路径
        max_retries: 3,                     // 上传失败最大重试次数
        dragdrop: true,                     // 开启可拖曳上传
        drop_element: 'container',          // 拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
        chunk_size: '4mb',                  // 分块上传时,每块的体积
        auto_start: true,                   // 选择文件后自动上传,若关闭需要自己绑定事件触发上传
        //x_vars : {
        //    查看自定义变量
        //    'time' : function(up,file) {
        //        var time = (new Date()).getTime();
              // do something with 'time'
        //        return time;
        //    },
        //    'size' : function(up,file) {
        //        var size = file.size;
              // do something with 'size'
        //        return size;
        //    }
        //},
        init: {
            'FilesAdded': function(up, files) {
                plupload.each(files, function(file) {
                    // 文件添加进队列后,处理相关的事情
                });
            },
            'BeforeUpload': function(up, file) {
                   // 每个文件上传前,处理相关的事情
            },
            'UploadProgress': function(up, file) {
                   // 每个文件上传时,处理相关的事情
            },
            'FileUploaded': function(up, file, info) {
                   // 每个文件上传成功后,处理相关的事情
                   // 其中info是文件上传成功后,服务端返回的json,形式如:
                   // {
                   //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
                   //    "key": "gogopher.jpg"
                   //  }
                   // 查看简单反馈
                   // var domain = up.getOption('domain');
                   // var res = parseJSON(info);
                   // var sourceLink = domain +"/"+ res.key; 获取上传成功后的文件的Url
            },
            'Error': function(up, err, errTip) {
                   //上传出错时,处理相关的事情
            },
            'UploadComplete': function() {
                   //队列文件处理完毕后,处理相关的事情
            },
            'Key': function(up, file) {
                // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
                // 该配置必须要在unique_names: false,save_key: false时才生效
    
                var key = "";
                // do something with key here
                return key
            }
        }
    });

    step3:封装组件

     1)directive模块:

    function wbUpLoad(Core, $timeout) {
    return {
    restrict: 'AE',
    templateUrl: 'views/directive/upLoad.html',
    transclude: true,
    scope: {
    upLoadError: "&",
    upLoadProgress: "&",
    upLoaded: "&"
    },
    link: function (scope, elem, attrs) {
    $timeout(function () {
    if (!attrs.browseButton) {
    attrs.browseButton = 'pickfiles';
    }
    var pickfiles = $('[browse-button=' + attrs.browseButton + ']').find('.pickfiles');
    pickfiles.attr('id', attrs.browseButton);
    var context = scope;
    var uploader = Qiniu.uploader({
    runtimes: 'html5,flash,html4',
    browse_button: attrs.browseButton,
    container: 'container',
    drop_element: 'container',
    flash_swf_url: 'bower_components/plupload/js/Moxie.swf',
    dragdrop: true,
    chunk_size: '4mb',
    uptoken_url: '/token/qiniu.json',
    multi_selection: false,
    filters: {
    max_file_size: '100000mb',
    prevent_duplicates: true,
    //Specify what files to browse for
    mime_types: [
    // {title : "mp4 files", extensions : "mkv"}
    // {title : "flv files", extensions : "flv,jpg"}
    // {title : "Video files", extensions : "flv,mpg,mpeg,avi,wmv,mov,asf,rm,rmvb,mkv,m4v,mp4"}
    // {title : "Video files", extensions : "avi,mp4,wmv,mpg,mov,flv,mkv,mpeg"}
    // {title : "Image files", extensions : "jpg,gif,png"}
    // {title : "Zip files", extensions : "zip"}
    ]
    },
    domain: 'http://xxxxx.com/',
    get_new_uptoken: false,
    // downtoken_url: '/downtoken',
    unique_names: false,
    // save_key: true,
    x_vars: {
    'time': function (up, file) {
    var time = (new Date()).getTime();
    // do something with 'time'
    return time;
    }
    },
    auto_start: true,
    log_level: 5,
    init: {
    'FilesAdded': function (up, files) {

    },
    'BeforeUpload': function (up, file) {
    var file_ext = file.name.substr(file.name.lastIndexOf("."));
    uploader.settings.multipart_params.key = parseInt(new Date().valueOf()) + file_ext;
    },
    'UploadProgress': function (up, file) {

    context.upLoadProgress({info: file});
    },
    'UploadComplete': function () {
    },
    'FileUploaded': function (up, file, info) {

    context.upLoaded({
    info: {info: info, file: file}
    });
    },
    'Error': function (up, err, errTip) {
    console.log('Error');
    console.log(up);
    console.log(err);
    context.upLoadError({info: err});
    }
    }
    });
    });
    }
    }
    }

     2)templateUrl 模块:

    <div id="container" style="display: inline-block;" ng-click="onClickGetToken()">
    <a class="pickfiles" id="pickfiles" style="display: inline-block;">
    <div ng-transclude>
    </div>
    </a>
    </div>

    3)html部分:

    <wb-up-load up-load-error="upLoadError(info)" up-loaded="upLoadSuccess(info,packageInItem)"
    up-load-progress="upLoadProgress(info)">
    <button style="color:#1D76FB;" class="btn btn-default">上传图片</button>
    </wb-up-load>
    <img class="small-img"  ng-src="{{valueLabelUrl}}">

    4)controller模块:

    var context = $scope;
    context.upLoadSuccess = upLoadSuccess;

    function upLoadSuccess(upLoadInfo, item) {
    //图片上传成功
    item.valueLabelUrl = "http:xxxxx.com/" + JSON.parse(upLoadInfo.info).key;
    context.$apply();
    }

    step4:效果预览

     

        

     上传成功后你只需要拿到对应的key就好了。

    ps:这就实现了七牛云图片上传功能,但是由于browse_button固定啦,同一个页面多个上传的按钮都是相同的browse_button id,点击按钮会触发多次上传事件,因此必须动态获取到每个不同按钮的id,并且在组件中赋值,组件中必须使用$timeout在dom渲染完成之后才能获取到对应的browse_button id。

    step5:修改组件和html ---------

    directive模块:

    function wbUpLoad($timeout) {
    return {
    restrict: 'AE',
    templateUrl: 'views/directive/upLoad.html',
    transclude: true,
    scope: {
    upLoadError: "&",
    upLoadProgress: "&",
    upLoaded: "&"
    },
    link: function (scope, elem, attrs) {
    $timeout(function () {
    if (!attrs.browseButton) {
    attrs.browseButton = 'pickfiles';//如果没有attrs.browseButton,id为pickfiles
                    }
    var pickfiles = $('[browse-button=' + attrs.browseButton + ']').find('.pickfiles');
    pickfiles.attr('id', attrs.browseButton);//设置id为html传入的browseButton值
    var context = scope;
    var uploader = Qiniu.uploader({
    runtimes: 'html5,flash,html4',
    browse_button: attrs.browseButton,
    container: 'container',
    drop_element: 'container',
    flash_swf_url: 'bower_components/plupload/js/Moxie.swf',
    dragdrop: true,
    chunk_size: '4mb',
    uptoken_url: '/token/qiniu.json',
    multi_selection: false,
    filters: {
    max_file_size: '100000mb',
    prevent_duplicates: true,
    //Specify what files to browse for
    mime_types: [
    // {title : "mp4 files", extensions : "mkv"}
    // {title : "flv files", extensions : "flv,jpg"}
    // {title : "Video files", extensions : "flv,mpg,mpeg,avi,wmv,mov,asf,rm,rmvb,mkv,m4v,mp4"}
    // {title : "Video files", extensions : "avi,mp4,wmv,mpg,mov,flv,mkv,mpeg"}
    // {title : "Image files", extensions : "jpg,gif,png"}
    // {title : "Zip files", extensions : "zip"}
    ]
    },
    domain: 'http://xxxxx.com/',
    get_new_uptoken: false,
    // downtoken_url: '/downtoken',
    unique_names: false,
    // save_key: true,
    x_vars: {
    'time': function (up, file) {
    var time = (new Date()).getTime();
    // do something with 'time'
    return time;
    }
    },
    auto_start: true,
    log_level: 5,
    init: {
    'FilesAdded': function (up, files) {

    },
    'BeforeUpload': function (up, file) {
    var user = Core.Data.getUser();
    var file_ext = file.name.substr(file.name.lastIndexOf("."));
    uploader.settings.multipart_params.key = parseInt(new Date().valueOf()) + file_ext;
    },
    'UploadProgress': function (up, file) {

    context.upLoadProgress({info: file});
    },
    'UploadComplete': function () {
    },
    'FileUploaded': function (up, file, info) {

    context.upLoaded({
    info: {info: info, file: file}
    });
    },
    'Error': function (up, err, errTip) {
    console.log('Error');
    console.log(up);
    console.log(err);
    context.upLoadError({info: err});
    }
    }
    });
    });
    }
    }
    }

    html部分:

    <wb-up-load up-load-error="upLoadError(info)" up-loaded="upLoadSuccess(info,packageInItem)"
    up-load-progress="upLoadProgress(info)" browse-button="pickfiles{{$index}}">
        <button style="color:#1D76FB;" class="btn btn-default">上传图片</button>
    </wb-up-load>
    <img class="small-img"  ng-src="{{valueLabelUrl}}">

     ps:以上修改可以同一页面多个按钮上传图片,如果你想点击图片在重新上传,可以将img写在组件里面,如果你还想实现鼠标移动到图片上预览大图,你可以给img加上鼠标事件,大图使用定位来展示。如:

    <img class="small-img" ng-mouseenter="isShowImg=true" ng-mouseleave="isShowImg=false" ng-src="{{packageInItem.valueLabelUrl}}">

    参考链接:利用七牛云图片上传总结

      -----原创文章,©版权所有,转载请注明标明出处:http://www.cnblogs.com/doinbean
  • 相关阅读:
    按照顺序打印一个数字的每一位
    JAVA中的方法递归
    静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
    相对于Statement,PreparedStatement的优点是什么?
    JDBC访问数据的基本步骤是什么
    说说事务的概念,在JDBC编程中处理事务的步骤
    String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
    什么是JDBC,在上面时候会用到它?
    jQuery 选择器
    Jquery的基本使用方式
  • 原文地址:https://www.cnblogs.com/doinbean/p/7589168.html
Copyright © 2020-2023  润新知