zoukankan      html  css  js  c++  java
  • ionic2+Angular 使用ng2fileupload 插件上传图片并实现本地预览

    第一步:npm install ng2-file-upload --save 安装 ng2-file-upload

     第二步:在需要使用该插件的页面的对应module文件的imports中引入CommonModule  和  FileUploadModule

    第三步:在对应的组件文件中引入并声明;

       2017-08-07补充:

    以下是new FileUploader()需要传入的参数列表,?号表示可选:

    第四步:在组件.ts对应的html文件中添加input标签;如下:

    multiple表示多选;
     
     第五步:在组件.ts文件中创建selectedFileOnChanged()方法,进行图片选择之后的操作,例如本地预览(将selectedImgUrl中的数据绑定到html)等。
     第六步:上传文件

    2017-08-07附加删除图片的逻辑处理:

    大家可以参考一下选择的图片在uploader:FileUploader中的存储规则

    第七步:完成图例:

     后记:2017-07-21 10:44

    如果出现下图的错误,肯能是因为没有导入第二步中的相关文件,也有可能是因为在第四步的input元素设置中缺少了ng2FileSelect

     2017-08-07 17:00补充逻辑处理的代码:

    import { Component } from '@angular/core';
    import { IonicPage, NavController, NavParams } from 'ionic-angular';
    import { FileUploader } from 'ng2-file-upload';
    
    @IonicPage({
        name: 'orderEvaluate',
        segment: 'orderEvaluate'
    })
    
    @Component({
        selector: 'page-order-evaluate',
        templateUrl: 'order-evaluate.html',
    })
    export class OrderEvaluatePage {
    
        public uploader: FileUploader = new FileUploader({ url: '图片上传地址' });
        selectedImgUrl: any[] = [];//存储已经选择的图片
        selectedImgLength = 0;
    
        constructor(
            public navCtrl: NavController,
            public navParams: NavParams) {
        }
    
        removeUpload(img) {
            //删除图片
            this.uploader.queue[img.uploadID].remove();
            this.selectedImgUrl.splice(img.uploadID, 1);
    
            this.selectedImgUrl.forEach((up, i) => {
                up.uploadID = i//重构与上传数据一致的结构
            });
    
            this.selectedImgLength = this.uploader.queue.length;
            console.log(this.uploader);
        }
    
        selectedFileOnChanged(index: number) {
            //选择图片
            let $this = this;//区别于new FileReader()中的this
            let selectedArr = this.selectedImgUrl;//存储选择的图片并进行标记存储
            this.uploader.queue.forEach((q, i) => {
                //this.selectedImgLength记录已选择的总的图片数量。并根据此来判断图片如何进行存储;
                if (this.selectedImgLength == 0 || i > this.selectedImgLength - 1) {
                    let reader = new FileReader();
                    reader.readAsDataURL(q.some);//生成base64图片地址,实现本地预览。只是same属性被protected修饰,需要修改。
                    reader.onload = function () {
                        let imgs = {
                            url: this.result,//当前选择的图片生成的base64图片地址
                            uploadID: i,//该图片在队列中的位置标记
                            pIndex: index//当前上传的图片所属,因为如果是订单评价的话,会存在多个商品,index就是标记上传的是哪个商品的评价图。
                        };
                        if (selectedArr.length > 0) {
                            let isSame = false;//标识是否选择过同一张图片
                            selectedArr.forEach((img, j) => { if (img.url == this.result) { isSame = true; } });
                            if (!isSame) {
                                //避免选择相同的图片
                                selectedArr.push(imgs);
                            } else {
                                $this.uploader.queue[i].remove();//如果已经选择,就需要在队列中移除该图片
                                $this.selectedImgLength = $this.uploader.queue.length;//并更新已选图片数量
                            }
                        } else { selectedArr.push(imgs) }
                    }
                }
            });
            this.selectedImgLength = this.uploader.queue.length;
        }
    
        uploadImg() {
            let $this = this;
            this.selectedImgUrl.forEach((img, i) => {
                //在上传的this.uploader队列中标记图片所属;根据项目需求        
                //如果同时对多个商品进行评价并上传图片,所有商品选择的图片是存储在同一个数组中,
                //所以上传之前需要标识属于哪个商品,上传成功之后返回的数据同样会带有标识
                this.uploader.queue[i]['pIndex'] = img.pIndex;
            });
    
    
            this.uploader.uploadAll() // 开始上传
            this.uploader.onSuccessItem = (item, res, status, headers) => {
                // 单张图片上传文件成功  
                //上传多张图片的话会执行多次
                if (status == 200) {
                    // 上传文件成功后获取服务器返回的数据
                    //根据项目需求处理返回来的数据;
                } else {
                    // 上传文件后获取服务器返回的数据错误   
                }
            };
            this.uploader.onCompleteAll = function () {
                //uploader: FileUploader服务是单张上传图片,
                //onCompleteAll可以检测到图片全部上传完成
                //全部图片上传结束
                //一般上传图片和上传其他评价的信息接口都是分开的,可以在此方法中构建需要上传的数据模型并调取相关接口
                //over
            }
        }
    }
     

     

  • 相关阅读:
    MQ:RocketMQ
    un-动物:大雁
    un-动物:鸽子
    POJ 1236 Network of Schools 强连通图
    Cocos2d-x 2.2.3 使用NDK配置安卓编译环境问题之 Cannot find module with tag 'CocosDenshion/android' in import path
    POJ3321:Apple Tree(树状数组)
    swift菜鸟入门视频教程-09-类和结构体
    Ambari-单步创建cluster
    折腾开源WRT的AC无线路由之路-5
    VMware虚拟机配置文件(.vmx)损坏修复
  • 原文地址:https://www.cnblogs.com/tomboyxiao/p/7110412.html
Copyright © 2011-2022 走看看