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 相关文章推荐
通过js脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
javascript AutoScroller 函数类
May 29 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
Dec 20 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
Dec 26 Javascript
详解js中==与===的区别
Jan 08 Javascript
JS实现的数字格式化功能示例
Feb 10 Javascript
Javascript继承机制详解
May 30 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 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实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
2011/10/09 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
javascript的BOM
2016/05/03 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
python之wxPython菜单使用详解
2014/09/28 Python
python 循环while和for in简单实例
2016/08/16 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
竞职演讲稿范文
2014/01/11 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
解析Java异步之call future
2021/06/14 Java/Android
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS