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高级程序设计 DOM学习笔记
Sep 10 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
Nov 25 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
小程序实现页面顶部选项卡效果
Nov 06 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 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
DISCUZ 分页代码
2007/01/02 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
jstree的简单实例
2016/12/01 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
详谈js模块化规范
2017/07/07 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
js实现随机点名
2021/01/19 Javascript
python调用新浪微博API项目实践
2014/07/28 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
python plotly绘制直方图实例详解
2019/07/22 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
Python执行时间的几种计算方法
2020/07/31 Python
Weblogic的布署方式
2013/08/23 面试题
财务主管自我鉴定
2014/01/17 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
办公经费申请报告
2015/05/15 职场文书
看雷锋电影观后感
2015/06/10 职场文书
埃及王子观后感
2015/06/16 职场文书
初二物理教学反思
2016/02/19 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技