最近项目需要实现一个需求,用户上传图片时,图片大小超过4M,长宽超过2000,需要压缩到400k,2000宽高.在git上找到一个不错的方法,把实现方法总结一下:
安装image-conversion包
npm i image-conversion --save
 
template
  1. <template>
  2. <div class="select_invoice">
  3. <el-upload
  4. class="upload-demo"
  5. :multiple="true"
  6. :action="uploadPath"
  7. :data="uploadData"
  8. accept="bmg,.png,.jpg,.jpeg"
  9. :before-upload="beforeUpload"
  10. :on-success="handleSuccess"
  11. :on-error="hanldeError"
  12. multiple
  13. :limit="20">
  14. <el-button size="small" type="primary">添加图片</el-button>
  15. </el-upload>
  16. </div>
  17. </template>
压缩的方法放在before-upload中,这个方法可以接受一个promise,提一下,最好下载新版本的element-UI,以前的旧版本可能不支持返回promise
js
  1. <script>
  2. // 引入image-conversion
  3. import imageConversion from 'image-conversion'
  4.  
  5. methods: {
  6. // 第一种,不考虑图片长宽,只考虑图片大小的情况,图片超过4M就压缩
  7. beforeUpload (file) {
  8. return new Promise((resolve, reject) => {
  9. let isLt2M = file.size / 1024 / 1024 < 4 // 判定图片大小是否小于4MB
  10. if (isLt2M) {
  11. resolve(file)
  12. }
  13. console.log(file)
  14. // 压缩到400KB,这里的400就是要压缩的大小,可自定义
  15. imageConversion.compressAccurately(file, 400).then(res => {
  16. // console.log(res)
  17. resolve(res)
  18. })
  19. })
  20. },
  21.  
  22. //第二种,图片大小超过4M,长度超过2000就压缩
  23. beforeUpload2 (file) {
  24. // 图片不大于4m,宽度不大于2000
  25. return new Promise((resolve, reject) => {
  26. let _URL = window.URL || window.webkitURL
  27. let isLt2M = file.size / 1024 / 1024 > 4 // 判定图片大小是否小于4MB
  28. // 这里需要计算出图片的长宽
  29. let img = new Image()
  30. img.onload = function () {
  31. file.width = img.width // 获取到width放在了file属性上
  32. file.height = img.height // 获取到height放在了file属性上
  33. let valid = img.width > 2000 // 图片宽度大于2000
  34. // console.log(11, file)
  35. // 这里我只判断了图片的宽度,compressAccurately有多个参数时传入对象
  36. if (valid || isLt2M) {
  37. imageConversion.compressAccurately(file, {
  38. size: 400,
  39. width: 2000
  40. }).then(res => {
  41. // console.log(33, res)
  42. resolve(res)
  43. })
  44. } else resolve(file)
  45. }
  46. // 需要把图片赋值
  47. img.src = _URL.createObjectURL(file)
  48. })
  49. },
  50. }
  51. </script>
这样就实现了图片的自动压缩功能,这个组件还有一些其他功能,使用的时候如果有其他需求,可以看下文档https://github.com/WangYuLue/image-conversion
 

vue+element-ui upload图片上传前大小超过4m,自动压缩到指定大小,长宽的更多相关文章

  1. Vue+Element UI 实现视频上传

    一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传AP ...

  2. 【antd Vue】封装upload图片上传组件(返回Base64)

    最近需要把上传的图片信息存储到数据库,以base64的方式,需要重新封装一下antd的upload组件 1. 使用方法 引入组件然后配置一下即可使用,配置项包括 defaultImageList,需要 ...

  3. input file实现多选,限制文件上传类型,图片上传前预览功能

    限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...

  4. html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  5. ASP.NET MVC图片上传前预览

    回老家过春节,大半个月,在家的日子里,吃好睡好,人也长了3.5Kg.没有电脑,没有网络,无需写代码,工作上相关的完全放下......开心与父母妻儿过个年,那样的生活令Insus.NET现在还在留恋.. ...

  6. file标签 - 图片上传前预览 - FileReader & 网络图片转base64和文件流

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  7. 前端的图片压缩image-compressor(可在图片上传前实现图片压缩)

    https://www.imooc.com/article/40038 https://www.jianshu.com/p/3ce3e3865ae2 前端的图片压缩image-compressor(可 ...

  8. HTML5 FileReader实现图片上传前预览

    如果你的浏览器支持Html5的FileReader的话,实现图片上传前进行预览是一件非常容易之事情. 在控制器,创建一个视图Action: jQuery代码: 实时演示一下: 下面内容于2014-11 ...

  9. 【转】html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

随机推荐

  1. PHP中smarty与MYSQL数据库的连接

    进行与MYSQL数据库的关联 先从最简单的数据库查询语句开始 1.先创建mysql数据库 仅仅创建一个测试数据 2.引用smarty框架 3.按照上文在damo文件夹下创建smarty_inc.php ...

  2. UC浏览器打开百度显示 丰臣吉秀.网址

  3. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_07-vuejs研究-vuejs基础-v-bind指令

    4.v-bind v-bind:无法双向绑定’ 1.作用: v‐bind可以将数据对象绑定在dom的任意属性中. v‐bind可以给dom对象绑定一个或多个特性,例如动态绑定style和class 2 ...

  4. 本地文件上传到Linux服务器

    1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地目录) 例如scp root@192.168.0.101: ...

  5. JS_&&||

    && 且 当第一个参数为flase 就懒惰了,后面那个无视了,当第一个参数为ture,再去贪婪:|| 或 当第一个参数为flase 就贪婪了,继续找和面个了,当第一个参数为ture,就 ...

  6. iOS-XMPP(转)

    IM的实现原理    在我最初学习编程的时候,曾经用JAVA实现了一个最简单版的IM通讯,即通过Socket建立两台电脑之间的连接,然后发送IO流来进行即时通讯,我们现在所使用的IM软件尽管看上去非常 ...

  7. Python学习笔记——esle和with 语句

    1. else与while组合 def showMaxFactor(num): count = num // 2 while count > 1: if num % count == 0: pr ...

  8. Beta冲刺博客

    这个作业属于哪个课程 当然是属于程序分析与设计呀 这个作业要求在哪里 在这儿 团队名称 六扇门编程小组(团队博客) 这个作业的目标 完成为期两周的β版本冲刺 1.团队信息 姓名 学号 曹欢(组长) 2 ...

  9. POJ 1161 Walls【floyd 以面为点建图】

    题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...

  10. js函数(3)

    8.5 作为命名空间的函数 即定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间. 将一段代码封装在函数内部,然后调用这个函数.这样全局变量就变成了函数内部的局部变量: ...