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 相关文章推荐
一个网马的tips实现分析
Nov 28 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
JS运动基础框架实例分析
Mar 03 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
Jul 17 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
js实现按座位号抽奖
Apr 05 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
从0到1构建vueSSR项目之路由的构建
Mar 07 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 Javascript
基于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
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jquery获取当前日期的方法
2015/01/14 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python中is和==的区别详解
2018/11/15 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
体育专业个人求职信范文
2013/12/27 职场文书
校运会口号
2014/06/18 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
故宫导游词
2015/01/31 职场文书
爱国教育主题班会
2015/08/14 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python