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 实现的全选和反选
Apr 15 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
May 05 Javascript
jquery实现input框获取焦点的方法
Feb 06 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
深入探究AngularJs之$scope对象(作用域)
Jul 20 Javascript
详解使用nvm管理多版本node的方法
Aug 30 Javascript
vue按需加载实例详解
Sep 06 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
JavaScript数组去重实现方法小结
Jan 17 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简单选择排序算法实例
2015/01/26 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
js实现旋转木马效果
2017/03/17 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
django实现前后台交互实例
2017/08/07 Python
python实现图书管理系统
2018/03/12 Python
python3爬取数据至mysql的方法
2018/06/26 Python
Python饼状图的绘制实例
2019/01/15 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
运动会稿件100字
2014/02/21 职场文书
合伙购房协议样本
2014/10/06 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
大学四年个人总结
2015/03/03 职场文书
人民检察院起诉书
2015/05/20 职场文书
教师病假条范文
2015/08/17 职场文书
python内置进制转换函数的操作
2021/06/02 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android