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 相关文章推荐
javascript中简单的进制转换代码实例
Oct 26 Javascript
jQuery中add()方法用法实例
Jan 08 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
JQuery中上下文选择器实现方法
May 18 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
web前端开发upload上传头像js示例代码
Oct 22 Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
在Vue项目中使用Typescript的实现
Dec 19 Javascript
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
基于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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php GeoIP的使用教程
2011/03/09 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php制作动态随机验证码
2015/02/12 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
jquery判断浏览器类型的代码
2012/11/05 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
Python3 修改默认环境的方法
2019/02/16 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
python按比例随机切分数据的实现
2019/07/11 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
数据库连接池的工作原理
2012/09/26 面试题
给公司的建议书范文
2014/05/13 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
个人查摆剖析材料
2014/10/04 职场文书
求职自我推荐信
2015/03/24 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
nginx请求限制配置方法
2021/07/09 Servers
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS