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实现代码
Mar 05 Javascript
jquery中each遍历对象和数组示例
Aug 05 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
让你彻底掌握es6 Promise的八段代码
Jul 26 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
Jun 10 jQuery
Vue 自定义指令实现一键 Copy功能
Sep 16 Javascript
小程序实现长按保存图片的方法
Dec 31 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 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
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP.MVC的模板标签系统(五)
2006/09/05 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
django项目搭建与Session使用详解
2018/10/10 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
python在地图上画比例的实例详解
2020/11/13 Python
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
人事行政主管岗位职责
2013/12/22 职场文书
委托书模板
2014/04/04 职场文书
产品销售计划书
2014/05/04 职场文书
医德医风演讲稿
2014/05/20 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书