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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
Dec 02 Javascript
JS、DOM和JQuery之间的关系示例分析
Apr 09 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 Javascript
jquery中animate的stop()方法作用实例分析
Jan 30 Javascript
全面解析Bootstrap表单使用方法(表单样式)
Nov 24 Javascript
jQuery实现下拉加载功能实例代码
Apr 01 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
Feb 17 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
Mar 05 Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 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 动态执行带有参数的类方法
2009/04/10 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Python中http请求方法库汇总
2016/01/06 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
python ssh 执行shell命令的示例
2020/09/29 Python
中学生自我鉴定
2014/02/04 职场文书
实习生求职自荐信
2014/02/07 职场文书
医德考评自我评价
2014/09/14 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
选购到合适的激光打印机
2022/04/21 数码科技
MySQL数据管理操作示例讲解
2022/12/24 MySQL