demo.vue 文件

<template>
<div class="demo">
<input v-model="importForm.month" type="text" name="month"/>
<input ref="importFile" type="file" name="importFile" @change="handleFileChange" />
<button @click="handleConfimImport">确认导入</button>
</div>
</template> <script>
export default {
name: 'profitLossTree',
components: {},
data(){
return {
importForm: {
month: '',
importFile: '',
},
}
},
computed: {},
watch: {},
methods: { //导入文件改变
handleFileChange(){
console.log(this.$refs.importFile.files[0]);
this.importForm.importFile = this.$refs.importFile.files[0];
// console.log(this.importForm, '改变');
},
// 确认导入
handleConfimImport(name){
/* //提取到 post_formData 方法中
// vue 中使用 window.FormData(),否则会报 'FormData isn't definded'
//创建一个FormData对象,然后通过append() 方法向对象中添加键值对
let formData = new window.FormData();
formData.append("month", this.importForm.month);
formData.append("importFile", this.importForm.importFile);
console.log('formData', formData); //formData中的参数是隐式的直接看不到, 可以通过formData 实例的get方法获取
console.log('formData--month', formData.get('month'));
console.log('formData--importFile', formData.get('importFile'));
this.$post_formData( '/profitLossController/importDataNew',
formData
).then( res => {
this.$Message.success('导入成功!');
}) .catch( error => {
this.$Message.error("请求数据出错");
});
}
*/ this.$post_formData('/profitLossController/importDataNew', {
'month': this.importForm.month ,
'importFile': this.importForm.importFile
}).then( res => {
this.$Message.success('导入成功!');
}) .catch( error => {
this.$Message.error("请求数据出错");
});
},
mounted(){ }
};
</script> <style scoped> </style>

对axios进行封装的http.js文件

import axios from 'axios';
import property from './property'; //引用基础配置文件
import util from './util'; //引用刚才我们创建的util.js文件,并使用getCookie方法
import qs from 'qs';
import Cookies from 'js-cookie';
// axios 配置
axios.defaults.timeout = 30000;
axios.defaults.baseURL = util.api; //这是调用数据接口
axios.defaults.withCredentials = true;
axios.defaults.headers = {
'Content-Type': 'application/json' //设置跨域头部
}; // http request 拦截器,通过这个,我们就可以把Cookie传到后台
axios.interceptors.request.use(
config => {
const token = Cookies.get('user'); //获取Cookie
if (token) {
config.headers.token = token;
// config.params = {'token': token}; //后台接收的参数,后面我们将说明后台如何接收
/**
* 原axios封装的时候对所有的请求请求 进行 JSON 转换,会破坏掉 formdata 提交数据,
* 所以可以通过axios.create() 创建一个新的实例(axiosInstanceNew)进行 formdata提交,见下
*/
config.data = JSON.stringify(config.data);
//将get请求的参数进行序列化,主要处理数组传值问题
config.paramsSerializer = function(params) {
return qs.stringify(params, {indices: false});
}
} else {
if (!util.oneOf(config.url, property.noTokenUrl)) {
location.reload();
}
}
return config;
},
err => {
return Promise.reject(err);
}
); // http response 拦截器
axios.interceptors.response.use(
response => {
//response.data.errCode是我接口返回的值,如果值为2,说明Cookie丢失,然后跳转到登录页,这里根据大家自己的情况来设定
// if(response.data.errCode == 2) {
// router.push({
// path: '/login',
// query: {redirect: router.currentRoute.fullPath} //从哪个页面跳转
// })
// }
return response;
},
error => {
switch (error.response.status) {
case 401:
Cookies.remove('user');
if (!util.oneOf(error.config.url.substring(util.api.length), property.noTokenUrl)) {
location.reload();
}
break;
// case 404:
//
// break;
// case 500:
//
// break;
default:
alert(`请求出错!请求状态码:${error.response.status}。`);
}
return error;
// if(error.response.status == 401){
// //this.$Message.error('32131');
// //util.delCookie('user');
// Cookies.remove('user')
// location.reload();
// }else{
// alert("请求出错!");
// }
//return Promise.reject(error.response.data)
}); export default axios;
// -------------------------------
//创建新的axios
//创建一个新的axios实例
const axiosInstanceNew = axios.create({
baseURL: util.api,
timeout: 30000,
withCredentials: true
}); //新axios实例拦截
// http request 拦截器,通过这个,我们就可以把Cookie传到后台
axiosInstanceNew.interceptors.request.use( config => {
const token = Cookies.get('user'); //获取Cookie
if (token) {
config.headers.token = token;
//将get请求的参数进行序列化,主要处理数组传值问题
config.paramsSerializer = function(params) {
return qs.stringify(params, {indices: false});
}
} else {
if (!util.oneOf(config.url, property.noTokenUrl)) {
location.reload();
}
}
return config;
},
err => {
return Promise.reject(err);
}
); // 新 http response 拦截器
axiosInstanceNew.interceptors.response.use( response => {
//response.data.errCode是我接口返回的值,如果值为2,说明Cookie丢失,然后跳转到登录页,这里根据大家自己的情况来设定
// if(response.data.errCode == 2) {
// router.push({
// path: '/login',
// query: {redirect: router.currentRoute.fullPath} //从哪个页面跳转
// })
// }
return response;
}, error => {
switch (error.response.status) {
case 401:
Cookies.remove('user');
if (!util.oneOf(error.config.url.substring(util.api.length), property.noTokenUrl)) {
location.reload();
}
break;
// case 404:
//
// break;
// case 500:
//
// break;
default:
alert(`请求出错!请求状态码:${error.response.status}。`);
}
return error;
// if(error.response.status == 401){
// //this.$Message.error('32131');
// //util.delCookie('user');
// Cookies.remove('user')
// location.reload();
// }else{
// alert("请求出错!");
// }
//return Promise.reject(error.response.data)
}); /**
* post 请求方法
* @param url
* @param data
* @returns {Promise}
*/
export function post (url, data = {}) {
axios.defaults.withCredentials = true;
return new Promise((resolve, reject) => {
axios.post(url, data)
.then(response => { resolve(response.data);
}, err => { reject(err);
});
});
}
/**
* post 请求方法 提交格式为 formdata
* @param url
* @param data
* @returns {Promise}
*/
export function post_formData (url, data = {}) { // vue 中使用 window.FormData(),否则会报 'FormData isn't definded'
//创建一个FormData对象,然后通过append() 方法向对象中添加键值对
// let formData = new window.FormData();
let formData = new FormData(); //这里是 .js文件
for ( let key in data ){
formData.append( key, data[key]);
} const options = {
method: 'POST',
// headers: { 'content-type': 'application/x-www-form-urlencoded' },
headers: { 'Content-type': 'multipart/form-data' },
// data: qs.stringify(data),
data: formData,
url,
};
return axiosInstanceNew(options);
}

说明:注意上面代码有这行注释的地方

        /**
         * 原axios封装的时候对所有的请求请求 进行 JSON 转换,会破坏掉 formdata 提交数据,
         * 所以可以通过axios.create() 创建一个新的实例(axiosInstanceNew)进行 formdata提交,见下
         */
为什么要创建一个新的axios实例的可以参考这篇文章:
 https://blog.csdn.net/qq_41688165/article/details/80834842 

在main.js中挂载到了vue实例原型上

import { post, post_formData } from './libs/http';
Vue.prototype.$post_formData = post_formData;

这样基本上就可以了。请求时参数直接传入一个对象就可以了。

vue+axios通过formdata提交参数和上传文件的更多相关文章

  1. vue axios使用form-data的形式提交数据的问题

    vue axios使用form-data的形式提交数据vue axios request payload form data由于axios默认发送数据时,数据格式是Request Payload,而并 ...

  2. .Net使用HttpClient以multipart/form-data形式post上传文件及其相关参数

    前言: 本次要讲的是使用.Net HttpClient拼接multipark/form-data形式post上传文件和相关参数,并接收到上传文件成功后返回过来的结果(图片地址,和是否成功).可能有很多 ...

  3. Ajax上传数据和上传文件(三种方式)

    Ajax向后端发送数据可以有三种方式:原生Ajax方式,jQuery Ajax方式,iframe+form 方式(伪造Ajax方式) <!DOCTYPE html> <html la ...

  4. php 下 html5 XHR2 + FormData + File API 上传文件

    FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

    写在前面 之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战] ...

  6. vue axios 与 FormData 结合 提交文件 上传文件

    ---再利用Vue.axios.FormData做上传文件时,遇到一个问题,后台虽然接收到请求,但是将文件类型识别成了字符串,所以,web端一直报500,结果是自己大意了. 1.因为使用了new  F ...

  7. vue+axios实现移动端图片上传

    在利用vue做一些H5页面时,或多或少会遇到有图片上传的操作,主要是运用html5里面的input[type=file]来实现,传递到后端的数据是以二进制的格式传递,所以上传图片的请求与普通的请求稍微 ...

  8. element ui axios使用formdata提交数据

    axios({ //formdata提交 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, transformRequ ...

  9. 传统表单提交文件上传,以及FormData异步ajax上传文件

    传统的文件上传: 只用将form表单的entype修改成multipart/form-data,然后就可以进行文件上传,这种方式常用并且简单. 以下是另一种方式FormData,有时候我们需要ajax ...

随机推荐

  1. js中const,var,let区别与用法(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36784628/article/d ...

  2. SeetaFaceDetection识别人脸

    SeetaFaceDetection识别人脸 #pragma warning(disable: 4819) #include <seeta/FaceEngine.h> #include & ...

  3. SegNet

    Paper link:https://arxiv.org/pdf/1511.00561.pdf Motivation:为了实际应用,主要是在时间效率和存储空间上做了改进: Introduction: ...

  4. 【helm & Tiller】报错Error: incompatible versions client[v2.14.1] server[v2.13.0] │

    helm是helm的客户端部分 tiller是helm的服务器端部分 报错 报错Error: incompatible versions client[v2.14.1] server[v2.13.0] ...

  5. react——Table组件

    /* * 构建数据列 * */ tableColumns = (currentData) => { let group = lodashGroupBy(currentData, 'level1' ...

  6. jQuery 控制網頁捲軸移動 & Ignore link '#' method jump action

    $('a.gotoheader').click(function(){ // 讓捲軸移動到 0 的位置 $(); // ignore link "#" method return ...

  7. JavaScript图形实例:图形的旋转变换

    旋转变换:图形上的各点绕一固定点沿圆周路径作转动称为旋转变换.可用旋转角表示旋转量的大小. 旋转变换通常约定以逆时针方向为正方向.最简单的旋转变换是以坐标原点(0,0)为旋转中心,这时,平面上一点P( ...

  8. js 验证手机号

    <script> var reg = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; function ver ...

  9. oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

    这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下   oracle 创建,删除存储过程,参数传递,创建 ...

  10. linux CentOS7 安装字体库-转

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库 ...