七牛云 vue 压缩上传 预览图片

<template>
    <div>
        <div class="rz-picter">
          <img :src="producImg" class="img-avatar">
          <input type="file" name="avatar" id="uppic" accept="image/gif,image/jpeg,image/jpg,image/png" @change="changeImage" ref="avatarInput" class="uppic">
        </div>
    </div>
</template>

<script>
import { Toast } from 'mint-ui';
export default {
    data() {
        return {
            uploadToken: '',
            producImg: ''
        }
    },
    methods: {
        photoCompress(file,obj,objDiv){
 
            var ready=new FileReader();
            /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
            ready.readAsDataURL(file);
            let that = this
            ready.onload=function(){
                var re=this.result;
                that.canvasDataURL(re,obj,objDiv)
            }
        },
        canvasDataURL(path, obj, callback){
            var img = new Image();
            img.src = path;
            img.onload = function(){
                var that = this;
                // 默认按比例压缩
                var w = that.width,
                    h = that.height,
                    scale = w / h;
                w = obj.width || w;
                h = obj.height || (w / scale);
                var quality = 0.7;  // 默认图片质量为0.7
                //生成canvas
                var canvas = document.createElement('canvas');
                var ctx = canvas.getContext('2d');
                // 创建属性节点
                var anw = document.createAttribute("width");
                anw.nodeValue = w;
                var anh = document.createAttribute("height");
                anh.nodeValue = h;
                canvas.setAttributeNode(anw);
                canvas.setAttributeNode(anh);
                ctx.drawImage(that, 0, 0, w, h);
                // 图像质量
                if(obj.quality && obj.quality <= 1 && obj.quality > 0){
                    quality = obj.quality;
                }
                // quality值越小,所绘制出的图像越模糊
                var base64 = canvas.toDataURL('image/jpeg', quality);
                // 回调函数返回base64的值
                callback(base64);
            }
        },
        convertBase64UrlToBlob(urlData){
            var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
            while(n--){
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], {type:mime});
        },
        changeImage(e) {
            var file = e.target.files[0]
            let data = new FormData();
            let that = this;
            if(file.size/1024 > 1025){
                this.photoCompress(file,{
                    quality: 0.5
                }, function(base64Codes){
                    //console.log("压缩后:" + base64Codes.length / 1024 + " " + base64Codes);die;
                    file = that.convertBase64UrlToBlob(base64Codes);
                    data.append('token', that.uploadToken);
                    data.append('file', file)
                    that.axios({
                        method: 'post',
                        url: 'http://upload-z2.qiniup.com',
                        data,
                        headers: {
                            'Content-Type': 'multipart/form-data'
                            // 'X-Requested-With': 'XMLHttpRequest'
                        }
                    })
                    .then(res => {
                        that.producImg = 'http://dingdanimage.ibabybaby.com/' + res.data.key
                    })
                    .catch(err => {
                        Toast(err)
                    })
                }
                )} else {
                    data.append('token', that.uploadToken);
                    data.append('file', file)
                    that.axios({
                        method: 'post',
                        url: 'http://upload-z2.qiniup.com',
                        data,
                        headers: {
                            'Content-Type': 'multipart/form-data'
                            // 'X-Requested-With': 'XMLHttpRequest'
                        }
                    })
                    .then(res => {
                        that.producImg = 'http://dingdanimage.ibabybaby.com/' + res.data.key
                    })
                    .catch(err => {
                        Toast(err)
                    })
                }
                // data.append('token', this.uploadToken);     //七牛需要的token,叫后台给,是七牛账号密码等组成的hash
                // data.append('file', file);
        }
    },
    created() {
        this.axios.get('/api/order/uploadToken')
        .then(res => {
            this.uploadToken = res.data.uploadToken
        })
        
    },
}
</script>

<style lang="scss" scoped>
.rz-picter {
    position:absolute;
    .img-avatar {
        width: 100px;
        height: 100px;
    }
    .uppic {
        height: 90px;
        width: 90px;
        margin: 0 auto;
        opacity: 0;
        z-index: 99999;
    }
    .img-avatar {
    position: absolute;
    }
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值