基于iview upload组件的上传图片

最近由于开发需求,使用iview的Upload组件实现上传图片,但在开发过程中遇到了一个很困扰的问题:由于图片是延缓加载的,执行的过程其实是图片已经上传之后才会去调用检测图片大小的方法,没有达到预期的目的,官方文档显示before-upload可以返回false或者Promise来阻止事件,以下为Promise方法,欢迎提供false方法。

前端代码:

<Upload
     ref="upload"
     :show-upload-list="false"
     :before-upload="handleBeforeUpload"
     :on-success="handleSuccess"
     :on-error="handleError"
     :format="['jpg','jpeg','png']"
     :max-size="50"
     :on-format-error="handleFormatError"
     :on-exceeded-size="handleMaxSize"                                                             
     action="/platform/fastdfs/uploadfastdfspic/v1.3"
     style="display: inline-block;width:82px;">
     <div style="width: 82px;height:82px;line-height: 82px;text-align:center;">                                                                    
         <img :src="item.icon" alt="" v-if="item.icon" class="imgItem">
         <Icon type="camera" size="20" v-else></Icon>
     </div>
</Upload>

JS代码

 // 准备上传
    handleBeforeUpload (file) {
        const that =this;
         return util.checkImageWH(file, 46, 46,function(){
            that.$Notice.warning({
                title: '文件尺寸限制',
                desc: '文件大小不超过46*46像素.'
            });
         });
    },
 // 上传时
    handleProgress(event,file){
        this.$Notice.info({
            title: '文件正在上传',
            desc: '文件 ' + file.name + ' 正在上传。'
        });
    },
 // 上传图片
    handleSuccess (res,file) {
        var index= this.changeBtnImg;
        this.resultAllConf.buttonConfList[index].icon = res.data;
        // this.$refs.editbtn.children[index].children[0].src = res.data;
        this.$Notice.success({
            title: '文件上传成功',
            desc: '文件 ' + file.name + ' 上传成功。'
        });
    },
    // 上传失败
    handleError (event, file) {
        this.$Notice.error({
            title: '文件上传失败',
            desc: '文件 ' + file.name + ' 上传失败。'
        });
    },
    handleRemove (index) {
        // 从 upload 实例删除数据
        this.changeBtnImg = index;
    },
    handleFormatError (file) {
        this.$Notice.warning({
            title: 'The file format is incorrect',
            desc: 'File format of ' + file.name + ' is incorrect, please select jpg or png.'
        });
    },
    handleMaxSize (file) {
        this.$Notice.warning({
            title: '文件大小限制',
            desc: '文件大小不超过50KB.'
        });
    },

接下来是最关键的限制大小的方法:

util.checkImageWH = function(file, width, height,fn) {
    let self = this;
    return new Promise(function (resolve, reject) {
        let filereader = new FileReader();
        filereader.onload = e => {
            let src = e.target.result;
            const image = new Image();
            image.onload = function () {
                if (width && this.width > width) {
                    fn()
                    reject();
                } else if (height && this.height > height) {
                   fn()
                    reject();
                } else {
                    resolve();
                }
            };
            image.onerror = reject;
            image.src = src;
        };
        filereader.readAsDataURL(file);
    });
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值