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 相关文章推荐
Jquery实现带动画效果的经典二级导航菜单
Mar 22 Javascript
ie7+背景透明文字不透明超级简单的实现方法
Jan 17 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
Web前端开发之水印、图片验证码
Nov 27 Javascript
Angular4 中常用的指令入门总结
Jun 12 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
Oct 15 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
Jul 30 Javascript
Vue.js实现的购物车功能详解
Jan 27 Javascript
Vue 中 a标签上href无法跳转的解决方式
Nov 12 Javascript
使用vue打包进行云服务器上传的问题
Mar 02 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
Apr 26 Javascript
antd form表单数据回显操作
Nov 02 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 采集程序原理分析篇
2010/03/05 PHP
PHP 日,周,月点击排行统计
2012/01/11 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
类似框架的js代码
2006/11/09 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
jquery 手势密码插件
2017/03/17 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
python中的闭包用法实例详解
2015/05/05 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
利用python求相邻数的方法示例
2017/08/18 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
商场总经理岗位职责
2014/02/03 职场文书
农村门前三包责任书
2014/07/25 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
农村党员干部承诺书
2015/05/04 职场文书
教师节联欢会主持词
2015/07/04 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
手残删除python之后的补救方法
2021/06/26 Python
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS