vuejs使用FormData实现ajax上传图片文件


Posted in Javascript onAugust 08, 2017

我相信很多使用vuejs的朋友,都有采用ajax上传图片的需求,因为前后端分离后,我们希望都能用ajax来解决数据问题,传统的表单提交会导致提交成功后页面跳转,而使用ajax能够无刷新上传图片等文件。

其实已经有朋友封装了相关的npm包,但是我想说用原生的js api来实现,也用不了多少代码,而且更灵活,能使用原生就尽量用原生。接下来就以一个简单的头像上传来说明如何使用。

效果图

vuejs使用FormData实现ajax上传图片文件

前端实现

<template>
 <div class="admin">
 <div class="admin-content">
  <div class="edit">
  <div class="avatar">
   <div class="img">
   <img :src="avatar" @click="setAvatar">
   <span>更改</span>
   </div>
   <input type="file" name="avatar" accept="image/gif,image/jpeg,image/jpg,image/png" style="display:none" @change="changeImage($event)" ref="avatarInput">
  </div>
  <button type="button" @click="edit">确认修改</button>
  </div>
 </div>
 </div>
</template>
<script>
export default {
 data() {
 return {
  avatar: this.$store.state.administrator.avatar,
 }
 },
 methods: {
 edit() {
  // 修改了头像
  if (this.$refs.avatarInput.files.length !== 0) {
   var image = new FormData()
   image.append('avatar', this.$refs.avatarInput.files[0])
   this.axios.post('/avatar', image, {
   headers: {
    "Content-Type": "multipart/form-data"
   }
   })
  }
  }) 
 },
 setAvatar() {
  this.$refs.avatarInput.click()
 },
 changeImage(e) {
  var file = e.target.files[0]
  var reader = new FileReader()
  var that = this
  reader.readAsDataURL(file)
  reader.onload = function(e) {
  that.avatar = this.result
  }
 }
 }
}
</script>

解释一下上面代码的意思,当我们点击图片会触发setAvatar函数,该函数会触发input的click事件,于是就会弹出文件选择框,当我们选择了一张图片后,触发chageImage函数,这个函数的功能就是预览你上传的图片,单后当我们点击修改按钮后,就会把资源传到后端

后端处理

后端接收到你上传的资源,肯定要把资源保存到服务器,我就以Nodejs来说明,我使用formidable解析上传的数据

exports.avatar = function(req, res, next) {
 let form = new formidable.IncomingForm()
 form.parse(req, function(err, fields, files) {
 if (err) {
  return res.json({
  "code": 500,
  "message": "内部服务器错误"
  })
 }

 // 获取后缀名
 let extname = path.extname(files.avatar.name)
 let oldpath = files.avatar.path;
 let newpath = './public/avatar' + extname;
 let avatarName = 'avatar' + extname;
 // 更改名字和路径
 fs.rename(oldpath, newpath, function(err) {
  if (err) {
  return res.json({
   "code": 401,
   "message": "图片上传失败"
  })
  }
 })
 // 更新数据库
 db.updateMany('users', { "user": username }, { "avatar": avatarName },
  function(err, result) {
  if (err) {
   return res.json({
   "code": 401,
   "message": "头像更新失败"
   })
  }
  return res.json({
   "code":200,
   "message": "头像上传成功"
  })
  })
 })
}

后端解析ajax提交的数据和解析采用传统表单提交的数据方法一样,如果你是做前端开发的,不了解后端代码影响不大。
说这么多,还是来个demo吧,https://github.com/wmui/vueblog,这个小项目后台有个头像修改的功能,是使用ajax上传图片的,核心代码百行不到,前后端分离。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JavaScript调用WebService的示例
Apr 07 Javascript
js函数中onmousedown和onclick的区别和联系探讨
May 19 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
Angular实现预加载延迟模块的示例
Oct 12 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
Mar 01 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
Vue.js如何使用Socket.IO的示例代码
Sep 05 Javascript
SSM VUE Axios详解
Oct 05 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
基于Vue实现支持按周切换的日历
Sep 24 #Javascript
JS中正则表达式要注意lastIndex属性
Aug 08 #Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
Aug 08 #Javascript
React Native如何消除启动时白屏的方法
Aug 08 #Javascript
react native带索引的城市列表组件的实例代码
Aug 08 #Javascript
React Native仿美团下拉菜单的实例代码
Aug 08 #Javascript
React-Native 组件之 Modal的使用详解
Aug 08 #Javascript
You might like
多数据表共用一个页的新闻发布
2006/10/09 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
php实现的SESSION类
2014/12/02 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python和C语言混合编程实例
2014/06/04 Python
Python中的闭包详细介绍和实例
2014/11/21 Python
Python AES加密模块用法分析
2017/05/22 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
Python是如何进行类型转换的
2013/06/09 面试题
毕业生求职简历中的自我评价
2013/10/18 职场文书
经理职责范文
2013/11/08 职场文书
销售团队获奖感言
2014/08/14 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
python 模块重载的五种方法
2021/04/24 Python
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python