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 入门基础学习
Mar 10 Javascript
JavaScript 事件系统
Jul 22 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
一看就懂:jsonp详解
Jun 01 Javascript
javascript去掉代码里面的注释
Jul 24 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
Feb 13 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 Javascript
layui中select,radio设置不生效的解决方法
Sep 05 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 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闭包函数详解
2016/02/13 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php查询内存信息操作示例
2019/05/09 PHP
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python最基本的输入输出详解
2015/04/25 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
scrapy爬虫实例分享
2017/12/28 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python中创建二维数组
2018/10/17 Python
python抖音表白程序源代码
2019/04/07 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
基于python操作ES实例详解
2019/11/16 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Django Form常用功能及代码示例
2020/10/13 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
利群广告词
2014/03/20 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
四风对照检查材料范文
2014/09/27 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android