vue中实现图片压缩 file文件的方法


Posted in Javascript onMay 28, 2020

项目中遇到上传图片需要在前端进行图片压缩,将我的实现思路记录一下。(我已经拿到上传的file文件的前提下)

先创建一个公用的js,这里我的是api.js,里面封装一些常用的方法

vue中实现图片压缩 file文件的方法

将图片压缩的方法写到这个公用的js(api.js)中

//base64转码(压缩完成后的图片为base64编码,这个方法可以将base64编码转回file文件)
function dataURLtoFile(dataurl) {
  var arr = dataurl.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 File([u8arr], { type: mime });

}
//压缩图片
function compressImg(file){
  var src;
  var files;
  var fileSize = parseFloat(parseInt(file['size'])/1024/1024).toFixed(2);
  var read = new FileReader();
  read.readAsDataURL(file);
  return new Promise(function(resolve, reject){
   read.onload = function (e) {
     var img = new Image();
     img.src = e.target.result;
     img.onload = function(){
       //默认按比例压缩
       var w = this.width,
         h = this.height;
       //生成canvas
       var canvas = document.createElement('canvas');
       var ctx = canvas.getContext('2d');
       var base64;
       // 创建属性节点
       canvas.setAttribute("width", w);
       canvas.setAttribute("height", h);
       ctx.drawImage(this, 0, 0, w, h);
       if(fileSize<1){
         //如果图片小于一兆 那么不执行压缩操作
         base64 = canvas.toDataURL(file['type'], 1);
       }else if(fileSize>1&&fileSize<2){
         //如果图片大于1M并且小于2M 那么压缩0.5
         base64 = canvas.toDataURL(file['type'], 0.5);
       }else{
         //如果图片超过2m 那么压缩0.2
         base64 = canvas.toDataURL(file['type'], 0.2);
       }
       // 回调函数返回file的值(将base64编码转成file)
       files = dataURLtoFile(base64); //如果后台接收类型为base64的话这一步可以省略
       
       resolve(files)
     };
   };
  })
};

//结尾处将该方法暴露出来供外部调用
export default {	
 compressImg,
}

在main.js中引入公用js(api.js)

import api from './http/api.js' //这里注意自己的路径
Vue.prototype.$api = api  //注册为全局变量

接下来在需要的地方调用我们的公用方法

this.$api.compressImg()//调用

我的调用方法
图片压缩的方法为异步执行 使用async await 解决异步问题(需要等压缩完成后)

//上传前压缩图片
   async beforeRead(file){//async await 解决异步问题,
    var formData = new FormData();//创建新的form
    if(file.length){   //file.length为真的时候说明是多图上传  要循环多图将file对象放进form中
     for(let i=0;i<file.length;i++){
      var f = await this.$api.compressImg(file[i]) //await只能放在async函数里 await会等待异步方法的返回值拿到以后在执行后面的方法
     formData.set('file'+i,f)
     }
    }else{
     let f = await this.$api.compressImg(file)
     formData.set('file0',f)
    }
   }

然后将formData传给后台,生成图片的线上地址就OK了!

总结

到此这篇关于vue中实现图片压缩 file文件的方法的文章就介绍到这了,更多相关vue图片压缩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS中Iframe之间传值的方法
Mar 11 Javascript
用jquery修复在iframe下的页面锚点失效问题
Aug 22 Javascript
使用vue.js制作分页组件
Jun 27 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
使用 Vue.js 仿百度搜索框的实例代码
May 09 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
Vue-router 中hash模式和history模式的区别
Jul 24 Javascript
jQuery pjax 应用简单示例
Sep 20 jQuery
js实现网页同时进行多个倒计时功能
Feb 25 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 Javascript
JS绘图Flot如何实现动态可刷新曲线图
Oct 16 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 #Javascript
Vue实现附件上传功能
May 28 #Javascript
如何使用Javascript中的this关键字
May 28 #Javascript
简单了解JavaScript arguement原理及作用
May 28 #Javascript
如何使用JavaScript检测空闲的浏览器选项卡
May 28 #Javascript
js实现轮播图特效
May 28 #Javascript
JS写滑稽笑脸运动效果
May 28 #Javascript
You might like
mysql 字段类型说明
2007/04/27 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
用Python进行TCP网络编程的教程
2015/04/29 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
基于Python的接口测试框架实例
2016/11/04 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
Python多项式回归的实现方法
2019/03/11 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
python实现门限回归方式
2020/02/29 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
爸爸的花儿落了教学反思
2014/02/20 职场文书
教师业务培训方案
2014/05/01 职场文书
大专学生求职信
2014/07/04 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
施工现场安全管理制度
2015/08/05 职场文书
导游词之无锡梅园
2019/11/28 职场文书
微信小程序和php的登录实现
2021/04/01 PHP