vue使用axios上传文件(FormData)的方法


Posted in Javascript onApril 14, 2019

在此主要介绍 如何使用 formData 对象上传单文件和多文件,FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。

过多介绍不说,过多的煽情语句不说,直接来来干活,希望对广大博友有所帮助。也希望各位大神不吝赐教

1.前台上传文件的表单和响应函数

<!--文件上传表单-->
<form>
 <input type="text" value="" v-model="name" placeholder="请输入用户名">
 <input type="text" value="" v-model="age" placeholder="请输入年龄">
 <input type="file" @change="getFile($event)">
 <input type="file" @change="getFile2($event)">
 <button @click="submit($event)">提交</button>
</form>

表单可以根据自己需要选择合适的表单,我在此选用的原生表单。

vue 定义文件数据类型:

data () {
 return{
  //文件
  file: '',
  file2: '',
 }
},

表单按钮的响应函数

getFile(event) {
 this.file = event.target.files[0];
 console.log(this.file);
},
getFile2(event) {
 this.file2 = event.target.files[0];
 console.log(this.file2);
},

上传单文件和多文件其实都是一样,主要的区别在后台接受文件形式和前台如何向后台传递数据

主要区别在 submit 响应函数中。

单文件例子:

submit(event) {
 event.preventDefault();//取消默认行为
 //创建 formData 对象
 let formData = new FormData();
 // 向 formData 对象中添加文件
 formData.append('file',this.file);
 
 http.uploadFile("taskManage/uploadFile2",formData).then(function (response) {
  console.log("res: ",response);
 })
},

多文件例子:

submit(event) {
 event.preventDefault();//取消默认行为
 //创建 formData 对象
 let formData = new FormData();
 // 向 formData 对象中添加文件
 formData.append('file',this.file);
 formData.append('file',this.file2);
 
 http.uploadFile("taskManage/uploadFile2",formData).then(function (response) {
  console.log("res: ",response);
 })
},

看到这里是不是感觉很搞笑,单文件和多文件的区别竟然在于向 formData 中添加了多少个文件。其实技术就是这样,玩过了,就觉得很好玩越来越有兴趣。

 注: http.uploadFile 是我自己封装的方法,用来上传文件的,为了防止文章没有针对性,就分开写了。

axios 和 ajax 都支持异步请求,两者使用方法大同小异,在此使用 axios 上传文件的请求。使用的时候只需要在响应的 vue 组件中引入就可以。

import Vue from 'vue';
import VueCookie from 'vue-cookie';
import axios from 'axios';
// import toastr from '../assets/toastr.min';
// Vue.use(axios)


let http = {};
// let _baseURL = '/vpaas'
let _baseURL = 'http://localhost:8080/vpaas'
let ContentType = "application/json";

let uploadFileType = "multipart/form-data";
http.baseURL = _baseURL;


/**
 * 上传文件的请求
 * @param url
 * @returns {AxiosPromise}
 */
http.uploadFile = function (url, data) {
 let config = {
  //请求的接口,在请求的时候,如axios.get(url,config);这里的url会覆盖掉config中的url
  url: url,
  //基础url前缀
  baseURL: _baseURL,
  transformResponse: [function (data1) {
   var data = data1;
   if (typeof data1 == "string") {
    data = JSON.parse(data1);
   }
   //这里提前处理返回的数据;
   if (data.message && (data.data === 'login.invalid.token')) {
    window.localStorage.removeItem("access-user");
    alert("超时请重新登陆");
    window.location.href = '/';
   }
   return data;
  }],
  //请求头信息
  headers: {'access-user': window.localStorage.getItem('access-user'), 'Content-Type': uploadFileType},

  //跨域请求时是否需要使用凭证
  withCredentials: true,
  // 返回数据类型
  responseType: 'json', //default
 };
 return axios.post(url, data, config);
};

哪里理解有误,欢迎各位大神不吝指教。

2:后台接受文件

控制器主要有一个全局的注解:

@RequestMapping("taskManage")

单文件的格式:

/**
 * 文件接收控制器
 */
@PostMapping("uploadFile")
public Object multipleSave(@RequestParam("file") MultipartFile file){
  logger.info("上传的文件:",file);
  logger.info("上传的文件");
  return null;
}

多文件格式:

后台接受方式有两种,两种都有不同的通途。

接受的文件个数为有限个时:

/**
 * 文件接收控制器
 */
@PostMapping("uploadFile")
public Object multipleSave(@RequestParam("file") MultipartFile file,@RequestParam("file2") MultipartFile file2){
  logger.info("上传的文件:",file);
  logger.info("上传的文件2:",file2);
  logger.info("上传的文件");
  return null;
}

接受文件个数为无限个时:

@PostMapping("uploadFile")
public Object multipleSave(@RequestParam("file") MultipartFile[] file){
  logger.info("上传的文件:",file);
  logger.info("上传的文件");
  return null;
}

利用数组的格式接收多文件,利用 for 循环就可以取出所有的文件,这里就不做一一解释了。    

方法都已经亲测,希望对广大博友有丝毫的帮助。也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
超清晰的document对象详解
Feb 27 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
Apr 25 Javascript
js字符编码函数区别分析
Dec 28 Javascript
jQuery功能函数详解
Feb 01 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
May 14 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
jQuery与getJson结合的用法实例
Aug 07 Javascript
js clearInterval()方法的定义和用法
Nov 11 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 Javascript
Bootstrap整体框架之JavaScript插件架构
Dec 15 Javascript
js实现点击按钮复制文本功能
Jul 20 Javascript
详解如何理解vue的key属性
Apr 14 #Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 #Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 #Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 #Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 #Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 #Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 #Javascript
You might like
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
Python 的AES加密与解密实现
2019/07/09 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
Python生成器generator原理及用法解析
2020/07/20 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
数据库面试要点基本概念
2013/10/31 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
远程研修随笔感言
2014/02/10 职场文书
大学军训感想
2014/02/12 职场文书
一年级小学生评语
2014/04/22 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
就业推荐表导师评语
2014/12/31 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL