第一步: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 } } }