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 相关文章推荐
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
Apr 20 Javascript
Cookie 小记
Apr 01 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
使用JQuery实现智能表单验证功能
Mar 08 Javascript
AngularJS监听路由的变化示例代码
Sep 23 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
vue实现在表格里,取每行的id的方法
Mar 09 Javascript
详解JavaScript修改注册表的方法
Jan 05 Javascript
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
详解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
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
python实现数独算法实例
2015/06/09 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
浅析python 字典嵌套
2020/09/29 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
租车协议书范本2014
2014/11/17 职场文书
2014年检验员工作总结
2014/11/19 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技