vue 使用原生组件上传图片的实例


Posted in Javascript onSeptember 08, 2020

需求描述:需要将后台返回的图片路径赋值到img的 src

1 一个页面上传一张图片

当一个页面只有一个位置需要上传图片,很简单,直接绑定上传按钮

html页面

<div class="col-md-4">
  <input class="hidden" accept="image/png,image/jpg" type="file" id="tempUploadFile" v-on:change="uploadPic($event)" />
  <input class="hidden" v-model="mapItem.MapIcon" />
  <img class="imgbgbox" v-bind:src="mapItem.MapIcon" />
 </div>

js代码:封装上传图片的方法

uploadPic(e) {
  var _self = this;
  var inputFile = e.target;
  if (!inputFile.files || inputFile.files.length <= 0) {
   return;
  }
  var file = inputFile.files[0];
  var formData = new FormData();
  formData.append('file', file);
  formData.append('SaveDir', 'Map/MapItem');
  formData.append("FileName", $.whiskey.tools.dateFormat(new Date(), "HHmmssffff"));
  $.ajax({
   url: "/Upload/UploadPic",//后台上传图片的方法
   type: 'POST',
   dateType: 'json',
   cache: false,
   data: formData,
   processData: false,
   contentType: false,
   success: function (res) {
    if (res.ResultType == 3) {
     var filePath = res.Data.file;//后台返回的图片路径
     _self.mapItem.MapIcon = filePath;//将路径赋值到声明的变量中
    }
   }
  });
},

2 一个页面上传多张图片

当一个页面有多个位置需要上传图片,如果按照上面方法,得需要绑定多个上传函数,所以我把重复的部分封装出来,用到了promise函数

html页面

<div class="col-md-4">
  <input class="hidden" accept="image/png,image/jpg" type="file" id="tempUploadFile" v-on:change="uploadPic($event)" />
  <input class="hidden" v-model="mapItem.MapIcon" />
  <img class="imgbgbox" v-bind:src="mapItem.MapIcon" />
 </div>

js代码:封装上传图片的方法

uploadPic(e) {
  var _self = this;
  var inputfile = e.target;
  _self.uploadImg(inputfile).then(data => {
   _self.mapItem.MapIcon = data;//data为取到的图片路径
  })
},
//封装函数
 uploadImg(inputFile) {
  var _self = this;
  if (!inputFile.files || inputFile.files.length <= 0) {
   return;
  } 
  return new Promise((suc,err)=>{
   var file = inputFile.files[0];
   var filepath = "";
   var formData = new FormData();
   formData.append('file', file);
   formData.append('SaveDir', 'Map/MapSite');
   formData.append("FileName", $.whiskey.tools.dateFormat(new Date(), "HHmmssffff"));
   $.ajax({
    url: "/Upload/UploadPic",
    type: 'POST',
    dateType: 'json',
    cache: false,
    data: formData,
    processData: false,
    async:false,
    contentType: false,
    success: function (res) {
     if (res.ResultType == 3) {
      filepath = res.Data.file;
      suc(filepath);
     }
    }
   });
  })
 },
},

补充知识:vue 利用原生input上传图片并预览并删除

看代码~

<template>
 <div class="com-upload-img">
 <div class="img_group">
  <div v-if="allowAddImg" class="img_box">
  <input type="file" accept="image/*" multiple="multiple" @change="changeImg($event)">
  <div class="filter" />
  </div>
  <div v-for="(item,index) in imgArr" :key="index" class="img_box">
  <div class="img_show_box">
   <img :src="item" alt="">
   <i class="img_delete" @click="deleteImg(index)" />
   <!-- <i class="img_delete" @click="imgArr.splice(index,1)"></i> -->
  </div>
  </div>
 </div>
 </div>
</template>

js部分

<script>
export default {
 name: 'ComUpLoad',
 data() {
 return {
  imgData: '',
  imgArr: [],
  imgSrc: '',
  allowAddImg: true
 }
 },
 methods: {
 changeImg: function(e) {
  var _this = this
  var imgLimit = 1024
  var files = e.target.files
  var image = new Image()
  if (files.length > 0) {
  var dd = 0
  var timer = setInterval(function() {
   if (files.item(dd).type !== 'image/png' && files.item(dd).type !== 'image/jpeg' && files.item(dd).type !== 'image/gif') {
   return false
   }
   if (files.item(dd).size > imgLimit * 102400) {
   // to do sth
   } else {
   image.src = window.URL.createObjectURL(files.item(dd))
   image.onload = function() {
    // 默认按比例压缩
    var w = image.width
    var h = image.height
    var scale = w / h
    w = 200
    h = w / scale
    // 默认图片质量为0.7,quality值越小,所绘制出的图像越模糊
    var quality = 0.7
    // 生成canvas
    var canvas = document.createElement('canvas')
    var ctx = canvas.getContext('2d')
    // 创建属性节点
    var anw = document.createAttribute('width')
    anw.nodeValue = w
    var anh = document.createAttribute('height')
    anh.nodeValue = h
    canvas.setAttributeNode(anw)
    canvas.setAttributeNode(anh)
    ctx.drawImage(image, 0, 0, w, h)
    var ext = image.src.substring(image.src.lastIndexOf('.') + 1).toLowerCase()// 图片格式
    var base64 = canvas.toDataURL('image/' + ext, quality)
    // 回调函数返回base64的值
    if (_this.imgArr.length <= 4) {
    _this.imgArr.unshift('')
    _this.imgArr.splice(0, 1, base64)// 替换数组数据的方法,此处不能使用:this.imgArr[index] = url;
    if (_this.imgArr.length >= 5) {
     _this.allowAddImg = false
    }
    }
   }
   }
   if (dd < files.length - 1) {
   dd++
   } else {
   clearInterval(timer)
   }
  }, 1000)
  }
 },
 deleteImg: function(index) {
  this.imgArr.splice(index, 1)
  if (this.imgArr.length < 5) {
  this.allowAddImg = true
  }
 }
 }
}
</script>

以上这篇vue 使用原生组件上传图片的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery find和children方法使用
Jan 31 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
May 28 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
Jan 15 Javascript
javaScript复制功能调用实现方案
Dec 13 Javascript
JS处理json日期格式化问题
Oct 01 Javascript
jQuery Validate表单验证深入学习
Dec 18 Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 Javascript
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
关于Layui Table隐藏列问题
Sep 16 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
Vue学习笔记之计算属性与侦听器用法
Dec 07 Javascript
如何基于js判断浏览器版本
Feb 20 Javascript
使用js和canvas实现时钟效果
Sep 08 #Javascript
javascript使用canvas实现饼状图效果
Sep 08 #Javascript
vue配置多代理服务接口地址操作
Sep 08 #Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 #Javascript
JS删除对象中某一属性案例详解
Sep 08 #Javascript
vue全局使用axios的操作
Sep 08 #Javascript
Vue自定义多选组件使用详解
Sep 08 #Javascript
You might like
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php Ajax乱码
2008/04/09 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中的Classes和Metaclasses详解
2015/04/02 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python的exec、eval使用分析
2017/12/11 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python 对象和json互相转换方法
2018/03/22 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
电力培训心得体会
2014/09/02 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
学校社团活动总结
2015/05/07 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
python面向对象版学生信息管理系统
2021/06/24 Python
mysql 生成连续日期及变量赋值
2022/03/20 MySQL