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 相关文章推荐
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
Jun 05 Javascript
html文本框提示效果的示例代码
Jun 28 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
AngularJS入门教程之静态模板详解
Aug 18 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
Sep 29 Javascript
Bootstrap DateTime Picker日历控件简单应用
Mar 25 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 jQuery
详解swipe使用及竖屏页面滚动方法
Jun 28 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
在实例中重学JavaScript事件循环
Dec 03 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
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
php GUID生成函数和类
2014/03/10 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
numpy中的高维数组转置实例
2018/04/17 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
幼儿园家长会欢迎词
2014/01/09 职场文书
主持人开场白台词
2015/05/29 职场文书
外出听课学习心得体会
2016/01/15 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
MySQL RC事务隔离的实现
2022/03/31 MySQL
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
Python实现简单得递归下降Parser
2022/05/02 Python