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展开闭合效果演示代码
Jul 24 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
JSON字符串转JSON对象
Jul 31 Javascript
基于javascript实现根据身份证号码识别性别和年龄
Jan 22 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
10个最优秀的Node.js MVC框架
Aug 24 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 Javascript
Element Card 卡片的具体使用
Jul 26 Javascript
vue 中使用print.js导出pdf操作
Nov 13 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
单位速度在实战中的运用
2020/03/04 星际争霸
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
让python json encode datetime类型
2010/12/28 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
python实现三种随机请求头方式
2021/01/05 Python
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
个人求职信范文分享
2014/01/06 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
工作说明书格式
2014/07/29 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
七年级英语教学反思
2016/02/15 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
Python经常使用的一些内置函数
2022/04/11 Python