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 得到文件后缀(通过正则实现)
Jul 08 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
AngularJS实现表格的增删改查(仅限前端)
Jul 04 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
Jan 08 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
Jul 03 jQuery
electron制作仿制qq聊天界面的示例代码
Nov 26 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
序列化模块json代码实例详解
Mar 03 Javascript
小程序使用分包的示例代码
Mar 23 Javascript
基于javascript实现日历功能原理及代码实例
May 07 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计划任务、定时执行任务的实现代码
2011/04/23 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
jquery 简单导航实现代码
2009/09/11 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
Vuex提升学习篇
2018/01/11 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
深入了解js原型模式
2019/05/30 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Python中表示字符串的三种方法
2017/09/06 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python读取stdin方法实例
2019/05/24 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
python怎么自定义捕获错误
2020/06/29 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
2014年安全生产目标责任书
2014/07/23 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
初中政治教学工作总结
2015/08/13 职场文书
新年寄语2016
2015/08/17 职场文书
anaconda python3.8安装后降级
2021/06/11 Python