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 相关文章推荐
新浪的图片新闻效果
Jan 13 Javascript
JS实现切换标签页效果实例代码
Nov 01 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
Feb 14 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
如何在wxml中直接写js代码(wxs)
Nov 14 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 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按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
python开启多个子进程并行运行的方法
2015/04/18 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python fabric实现远程部署
2017/01/05 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
python如何将图片转换素描画
2020/09/08 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
销售总监工作职责
2013/11/21 职场文书
清洁工岗位职责
2014/01/29 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
升国旗仪式主持词
2014/03/19 职场文书
志愿者个人总结
2015/03/03 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python