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 处理事件绑定的一些兼容写法
Dec 24 Javascript
jquery中checkbox全选失效的解决方法
Dec 26 Javascript
javascript三元运算符用法实例
Apr 16 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
Sep 27 Javascript
JS中数组重排序方法
Nov 11 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
浅谈vue中.vue文件解析流程
Apr 24 Javascript
JavaScript点击按钮生成4位随机验证码
Jan 28 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
Feb 08 Javascript
JavaScript中reduce()的用法
May 11 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几个数学计算的内部函数学习整理
2011/08/06 PHP
Yii全局函数用法示例
2017/01/22 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
网站上面有这种切换效果
2006/06/26 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
Python中functools模块的常用函数解析
2016/06/30 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
分析Python读取文件时的路径问题
2018/02/11 Python
Python判断telnet通不通的实例
2019/01/26 Python
深入浅析python的第三方库pandas
2020/02/13 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
分享一个python的aes加密代码
2020/12/22 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
医院护士专业个人的求职信
2013/12/09 职场文书
学生评语大全
2014/04/18 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
南极大冒险观后感
2015/06/05 职场文书
创业计划书之网吧
2019/10/10 职场文书