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 相关文章推荐
jQuery 入门级学习笔记及源码
Jan 22 Javascript
jQuery 下拉列表 二级联动插件分享
Mar 29 Javascript
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
jQuery的ready方法详解
Nov 27 Javascript
script标签属性用type还是language
Jan 21 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
May 25 Javascript
Bootstrap框架的学习教程详解(二)
Oct 18 Javascript
详解用node编写自己的cli工具
May 23 Javascript
通俗易懂地解释JS中的闭包
Oct 23 Javascript
vue框架搭建之axios使用教程
Jul 11 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
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
node跨域请求方法小结
2017/08/25 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
总结Python中逻辑运算符的使用
2015/05/13 Python
python unittest实现api自动化测试
2018/04/04 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
Python引用计数操作示例
2018/08/23 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
汇科协同Java笔试题
2012/03/31 面试题
学雷锋标语
2014/06/25 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
幼师辞职信范文
2015/02/27 职场文书
2015年度女工工作总结
2015/10/22 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL