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 相关文章推荐
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
Aug 13 Javascript
json格式化/压缩工具 Chrome插件扩展版
May 25 Javascript
JavaScript实用技巧(一)
Aug 16 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
javascript实现类似超链接的效果
Dec 26 Javascript
jQuery中toggleClass()方法用法实例
Jan 05 Javascript
jQuery中$.click()无效问题分析
Jan 29 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 Javascript
详解javascript 正则表达式之分组与前瞻匹配
May 30 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 Javascript
js实现双人五子棋小游戏
May 28 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
第二节--PHP5 的对象模型
2006/11/16 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
linux下编译安装memcached服务
2014/08/03 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python中的作用域规则详解
2015/01/30 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
Python连接mysql方法及常用参数
2020/09/01 Python
python3中确保枚举值代码分析
2020/12/02 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
后勤副校长自我鉴定
2013/10/13 职场文书
留学推荐信中文范文三篇
2014/01/25 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
召开会议通知范文
2015/04/15 职场文书
格林童话读书笔记
2015/06/30 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS