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 相关文章推荐
类似CSDN图片切换效果脚本
Sep 17 Javascript
动态加载js、css等文件跨iframe实现
Feb 24 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
Mar 01 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
Vue概念及常见命令介绍(1)
Dec 08 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
深入理解javascript中concat方法
Dec 12 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
详解基于原生JS验证表单组件xy-form
Aug 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如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
js实现网页随机验证码
2020/10/19 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
详解Python之unittest单元测试代码
2018/01/24 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python 阶乘累加和的实例
2019/02/01 Python
超实用的 30 段 Python 案例
2019/10/10 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
pymysql模块的操作实例
2019/12/17 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
《老王》教学反思
2014/02/23 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
师德师风个人总结
2015/02/06 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby
app场景下uniapp的扫码记录
2022/07/23 Java/Android