vue+axios通过formdata提交参数和上传文件

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;

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

原文地址:https://www.cnblogs.com/taohuaya/p/12018371.html

时间: 2024-07-29 11:02:24

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

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

FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormData的最大优点就是我们可以异步上传一个二进制文件. 例1如下: <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>

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

---再利用Vue.axios.FormData做上传文件时,遇到一个问题,后台虽然接收到请求,但是将文件类型识别成了字符串,所以,web端一直报500,结果是自己大意了. 1.因为使用了new  FormData来操作表单,并且在测试模拟请求时,从消息头里看到的确实是表单提交[Content-Type: multipart/form-data]. 所以就没有单独在设置. 结果后来加上了这个配置才可以通过了.这里的原理请参照转发大神的原帖. 这个必须设置:Content-Type: multip

Vue+axios+Servlet 中提交表单数据(含上传图片)超详版!!!

1.HTML页面 这里用post方法传送,大小不受限制:还用了v-model的双向绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <link href="../css/bootstrap.css" type="text/css" rel="stylesheet&

ajax提交formData iframe springmvc 上传文件 页面是通过iframe嵌入的html

1.引入讲个jar包 springmvc设置 commons-fileupload-1.3.3.jar commons-io-2.5.jar <!-- 定义文件解释器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置默认编码 --> <prop

WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)

简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分: HttpClient通过PostAsync提交数据时,第二个请求参数为抽象类HttpContent,当前我们需要通过multipart/form-data的方式模拟请求,multipart对应的请求HttpContent为MultipartContent及其子类MultipartFormData

关于JS提交file 上传文件

 最近因写一个上传功能,不能刷新页面,且页面得有后台返回的信息,因而不能使用form直接提交表单,尝试使用is提交并接受返回数据,不多说代码如下: 前台: <form id='pdf-form' enctype="multipart/form-data" method="POST" action="" > <input type="hidden" name="order_id" value

django-form.errors和上传文件

一.上传文件: 在相应的模型里面定义`FileField`或者是`ImageField`类型的字段,并且1.设置好`upload_to`参数来指定上传的路径. headshot = models.ImageField(u'头像', upload_to="upload/%Y/%m/%d")  # 上传的路径,django自己创建路径 如果是使用ImageField,会需要安装一个依赖Pillow, Pillow是专门做图片处理的一个python包 pip install Pillow 2

使用libcurl POST数据和上传文件

为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度.fc也可以是任何其它内容.curl 是 libcurl句柄.演示省略了很多显而易见的步骤. 1. 普通的post请求,这里用curl_easy_escape对fc做了编码 std::string data("req=plain"); data.append("&file="); char *efc = curl_easy_escape(curl, fc, fclen); data.appe

php curl模拟 get,post提交,上传文件,下载文件

CURL学习: 文章目录 get,post提交. 上传文件 模拟get,post提交 get提交,直接写到url上. $ch=curl_init();//初始化一个CURL对话: curl_setopt($ch, CURLOPT_URL, "http://localhost/wish/test/file2.php?t=1&p=2"); curl_setopt($ch, CURLOPT_HEADER, 0); // 抓取URL并把它传递给浏览器 curl_exec($ch); /