Vue移动端实现图片上传及超过1M压缩上传


Posted in Javascript onDecember 23, 2019

本文实例为大家分享了Vue移动端实现图片上传及超过1M压缩上传的具体代码,供大家参考,具体内容如下

1、实现效果

Vue移动端实现图片上传及超过1M压缩上传

2、代码

Html:

<div class="choosePic">
  <div class="pics" :style="{backgroundImage: 'url(' + form.erpRecords + ')'}">
   <input type="file" class="uploads" @change="uploadserpRecords" accept="image/*" multiple >
   <img src="../../assets/home/ic_AddImage@3x.png" alt="" v-if="form.erpRecords == ''">
   <div v-if="form.erpRecords == ''">添加图片</div>
  </div>
</div>

Css:使用了less ,需要引入less,才能使用(npm install less less-loader --save)

.choosePic{
  margin: 0.64rem 0;
  .pics{
  background-position: center;
  background-size: cover;
  width: 15.1467rem;
  height: 5.5467rem;
  background-color: #F9F9F9;
  border: 2px solid #C3C3C3;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1rem;
  color: #3DCA9A;
  font-weight: bold;
  border-radius: 0.213rem;
  >div{
   margin-left: 0.213rem;
   letter-spacing: 2px
  }
  .uploads{
   position: absolute;
   z-index: 99;
   left: 0;
   width: 99%;
   height: 5.5467rem;
   opacity: 0;
  }
  img{
   width: 1.4933rem;
   height: 1.4933rem;
  }

  }
 }

JS:

/**
 * 上传销售记录
 */
uploadserpRecords (e) {
 let file = e.target.files[0]
 if (file === undefined) {
 return
 }
 if (file.size / 1024 > 1025) { // 文件大于1M(根据需求更改),进行压缩上传
 that.photoCompress(file, { // 调用压缩图片方法
  quality: 0.2
 }, function (base64Codes) {
  // console.log("压缩后:" + base.length / 1024 + " " + base);
  let bl = that.base64UrlToBlob(base64Codes)
  // file.append('file', bl, 'file_' + Date.parse(new Date()) + '.jpg') // 文件对象
  that.uploadLice(bl) // 请求图片上传接口
 })
 } else { // 小于等于1M 原图上传
 this.uploadLice(file)
 }
}, 
/**
 * base64 转 Blob 格式 和file格式
 */
base64UrlToBlob (urlData) {
 let arr = urlData.split(','),
 mime = arr[0].match(/:(.*?);/)[1], // 去掉url的头,并转化为byte
 bstr = atob(arr[1]), // 处理异常,将ascii码小于0的转换为大于0
 n = bstr.length,
 u8arr = new Uint8Array(n)
 while (n--) {
 u8arr[n] = bstr.charCodeAt(n)
 }
 // 转blob
 // return new Blob([u8arr], {type: mime})
 let filename = Date.parse(new Date()) + '.jpg'
 // 转file
 return new File([u8arr], filename, {type: mime})
},
 /*
 压缩图片
 file:文件(类型是图片格式),
 obj:文件压缩后对象width, height, quality(0-1)
 callback:容器或者回调函数
*/
photoCompress (file, obj, callback) {
 let that = this
 let ready = new FileReader()
 /* 开始读取指定File对象中的内容. 读取操作完成时,返回一个URL格式的字符串. */
 ready.readAsDataURL(file)
 ready.onload = function () {
 let re = this.result
 that.canvasDataURL(re, obj, callback) // 开始压缩
 }
},
/* 利用canvas数据化图片进行压缩 */
/* 图片转base64 */
canvasDataURL (path, obj, callback) {
 let img = new Image()
 img.src = path
 img.onload = function () {
 let that = this // 指到img
 // 默认按比例压缩
 let w = that.width,
  h = that.height,
  scale = w / h
 w = obj.width || w
 h = obj.height || (w / scale)
 let quality = 0.2 // 默认图片质量为0.7
 // 生成canvas
 let canvas = document.createElement('canvas')
 let ctx = canvas.getContext('2d')
 // 创建属性节点
 let anw = document.createAttribute('width')
 anw.nodeValue = w
 let anh = document.createAttribute('height')
 anh.nodeValue = h
 canvas.setAttributeNode(anw)
 canvas.setAttributeNode(anh)
 ctx.drawImage(that, 0, 0, w, h)
 // 图像质量
 if (obj.quality && obj.quality >= 1 && obj.quality < 0) {
  quality = obj.quality
 }
 // quality值越小,所绘制出的图像越模糊
 let base64 = canvas.toDataURL('image/jpeg', quality)
 // 回调函数返回base64的值
 callback(base64)
 }
},
// 返回file文件,调用接口执行上传
uploadLice (file) {
 console.log(file)
 uploadLog(file, (data) => {
 this.form.operatingLicense = data
 console.log(data)
 })
},

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

更多vue学习教程请阅读专题《vue实战教程》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS传值出现中文参数乱码的解决方法
Jun 30 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
JavaScript 中有关数组对象的方法(详解)
Aug 15 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
javaScript基础详解
Jan 19 Javascript
vue注册组件的几种方式总结
Mar 08 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
Mar 14 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
vue计算属性get和set用法示例
Feb 08 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
解决vue-router 切换tab标签关闭时缓存问题
Jul 22 Javascript
JavaScript 防篡改对象的用法示例
Apr 24 Javascript
vue图片上传组件使用详解
Dec 23 #Javascript
微信小程序实现签字功能
Dec 23 #Javascript
使用JS location实现搜索框历史记录功能
Dec 23 #Javascript
vue实现移动端图片上传功能
Dec 23 #Javascript
vue实现拖拽效果
Dec 23 #Javascript
JQuery常用选择器功能与用法实例分析
Dec 23 #jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 #jQuery
You might like
十天学会php之第十天
2006/10/09 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
python调用接口的4种方式代码实例
2019/11/19 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
以下的初始化有什么区别
2013/12/16 面试题
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
相亲活动方案
2014/08/26 职场文书
2014年底工作总结
2014/12/15 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
python 安全地删除列表元素的方法
2022/03/16 Python