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_03(ExtJs Grid的简单使用)
Oct 02 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
Jul 31 Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 Javascript
js闭包用法实例详解
Dec 13 Javascript
详解JavaScript RegExp对象
Feb 04 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
Mar 23 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
JavaScript实现form表单的多文件上传
Mar 27 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
5种Python单例模式的实现方式
2016/01/14 Python
python通过zabbix api获取主机
2018/09/17 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python理解递归的方法总结
2019/01/28 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
金讯Java笔试题目
2013/06/18 面试题
Python中如何定义一个函数
2016/09/06 面试题
给领导的致歉信范文
2014/01/13 职场文书
教师自我反思材料
2014/02/14 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
模具专业求职信
2014/06/26 职场文书
介绍信的写法
2015/01/31 职场文书
运动会200米广播稿
2015/08/19 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书