vue在图片上传的时候压缩图片


Posted in Vue.js onNovember 18, 2020

需求:

上传到服务器的图片太大会导致服务器承受不了,故在前端传图片的时候将图片压缩后再传到服务器

直接上代码

async getRealName(){

    let nickname = this.nickname.trim()

    let idnum = this.idnum.trim()

    let nameReg = /[\u4e00-\u9fa5]/gm

    let idnumReg = /^[a-z0-9]+$/i

    let zheng1 = document.getElementById("file1").files[0]

    let fan1 = document.getElementById("file2").files[0]

    if(nickname.length < 1) {

     return Toast('请输入姓名')

    }

    if(idnum.length < 1) {

     return Toast('请输入身份证号码')

    }

    if(!zheng1) {

     return Toast('请上传身份证信息页')

    }

    if(!fan1) {

     return Toast('请上传身份证国徽页')

    }

    if(zheng1.size/1024 > 1025) {

     this.imgCompress(zheng1,{quality:0.2},'zheng')

    }else {

     this.zheng = zheng1

    }

    if(fan1.size / 1024 > 1025) {

     this.imgCompress(fan1,{quality:0.2},'fan')



    }else {

     this.fan = fan1

    }

 

    setTimeout(()=>{

     let data = new FormData()

     data.append('nickname',nickname);//添加form表单中其他数据

     data.append('idnum',idnum)

     data.append('zheng',this.zheng,zheng1.name)

     data.append("fan",this.fan,fan1.name)

     let apiauth = localStorage.getItem('apiauth')

     let config = {

      headers:{'Content-Type':'multipart/form-data'},

      herders:{apiauth:apiauth}

     }

     axios.post("http://api139.ys11.ipfsico.com/index/index/realname",data,config).then((res)=>{

      Toast(res.data.msg)

      if(res.data.code == 1) {

       this.$router.replace({path:'/msite'})

      }

     })

    },1000)

 

 

   },

   //图片压缩

   imgCompress(path,obj,statu){

    let _this = this //这里的this 是把vue的实例对象指向改变为_this

    var img = new Image();

    if(statu == 'zheng') {

     img.src = _this.avatar1;

    }else {

     img.src = _this.avatar2

    }

    img.onload = function(){

     var that = this; //这里的this 是把img的对象指向改变为that 

     // 默认按比例压缩

     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的值

     var urlFile = _this.convertBase64UrlToBlob(base64) //这个地方的处理是为了把压缩的base64转化为对象,获得压缩后图片的大小size,方便对压缩后的图片再次进行判断;

     // console.log(urlFile)

     let file = _this.blobToFile(urlFile,path.name)

     console.log(file)

     if(statu == 'zheng') {

      _this.zheng = file

     }else {

      _this.fan = file

     }

 

     if(urlFile.size/1024 > 1025){

      Toast("图片过大,请重新上传图片")

     }

 

    }

 

   },

   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});

   },

   blobToFile(theBlob, fileName){

 

    theBlob.lastModifiedDate = new Date();

    theBlob.name = fileName;

    return theBlob;

   },

   changeImage(e) {

    console.log(e.target.files)

    if(e.target.files[0]){

     this.ownImg = false

     var file = e.target.files[0];

     console.log(file)

     let filemaxsize = 4096

     let size = file.size / 1024

     if (size > filemaxsize){

      Toast('您上传的图片过大,请重新选择')

      this.disabled = true;

      this.formatImg = false

      return false

     }

     var name = file.name

     var fileTypes = [".jpg", ".png"];

     if(name) {

      var isNext = false;

      var fileEnd = name.substring(name.indexOf("."));

      for (var i = 0; i < fileTypes.length; i++) {

       if (fileTypes[i] == fileEnd) {

        console.log(fileTypes[i])

        isNext = true;

        this.disabled = false;

        this.formatImg = true;

        break;

       }

      }

      if (!isNext){

       Toast('暂不支持该类型图片');

       name = "";

       this.disabled = true;

       this.formatImg = false

       return false;

      }

     }

     var reader = new FileReader()

     var that = this

     var image = new Image()

     reader.readAsDataURL(file)

     reader.onload = function(e) {

      that.avatar1 = this.result

     }

    }

   },

   changeImg(event){

    var file = event.target.files[0]

    var name = file.name

    var fileTypes = [".jpg", ".png"];

    if(name) {

     var isNext = false;

     var fileEnd = name.substring(name.indexOf("."));

     for (var i = 0; i < fileTypes.length; i++) {

      if (fileTypes[i] == fileEnd) {

       console.log(fileTypes[i])

       isNext = true;

       this.disabled = false;

       this.formatImg = true;

       break;

      }

     }

     if (!isNext){

      Toast('暂不支持该类型图片');

      name = "";

      this.disabled = true;

      this.formatImg = false

      return false;

     }

    }

    var reader = new FileReader()

    var that = this

    reader.readAsDataURL(file)

    reader.onload = function(event) {

     that.avatar2 = this.result

    }

   }

以上就是vue在图片上传的时候压缩图片的详细内容,更多关于vue 压缩图片的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
在Vue中使用mockjs代码实例
Nov 25 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
vue如何清除浏览器历史栈
May 25 Vue.js
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 #Vue.js
springboot+vue实现文件上传下载
Nov 17 #Vue.js
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 #Vue.js
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 #Vue.js
Vue项目利用axios请求接口下载excel
Nov 17 #Vue.js
vue实现下载文件流完整前后端代码
Nov 17 #Vue.js
vue+iview实现文件上传
Nov 17 #Vue.js
You might like
提取HTML标签
2006/10/09 PHP
php汉字转拼音的示例
2014/02/27 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
浅谈python3中input输入的使用
2019/08/02 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python将字母转化为数字实例方法
2019/10/04 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
python Cartopy的基础使用详解
2020/11/01 Python
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
大学团支书的自我评价分享
2013/12/14 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
八一演出活动方案
2014/02/03 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
个人收入证明范本
2015/06/12 职场文书
婚宴新娘致辞
2015/07/28 职场文书
解除合同协议书范本
2016/03/21 职场文书
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers