vue iview upload组件上传跨域在前端代理解决

14 篇文章 0 订阅

vue 的 iview upload组件上传存在跨域问题

<template>
    <Upload action="//jsonplaceholder.typicode.com/posts/">
        <Button icon="ios-cloud-upload-outline">Upload files</Button>
    </Upload>
</template>

因为action必须填写完整路径,比如 http://localhost:8081/upload ,这样就出现了跨域问题,网上博客都是说在后端解决跨域问题,但是我的后端集成了spring security,在后端设置跨域,会造成新的问题(详见 https://blog.csdn.net/qq1032355091/article/details/89280899),所以我还是希望在前端代理解决跨域问题。

但是upload组件的action请求没办法代理跨域,解决办法如下:

1.使用iview的手动上传组件

<Upload
          :before-upload="handleUpload"
          action="//jsonplaceholder.typicode.com/posts/">
            <Button icon="ios-cloud-upload-outline">选择excel文件上传</Button>
        </Upload>
        <div v-if="file !== null">
            待上传文件: {{ file.name }}
            <Button type="text" @click="upload" :loading="loadingStatus">{{ loadingStatus ? '上传中' : '点击上传' }}</Button>
        </div>

注意:此时action设置任何值都无所谓,但是必须有值,这个值并不生效 ,不然报错。

2.methods里面编写upload方法

handleUpload (file) {
            this.file = file;
            return false;
          },

upload () {
            let fileFormData = new FormData();
            fileFormData.append('file', this.file);
            let requestConfig = {
              headers: {
                'Content-Type': 'multipart/form-data'
              },
            }
            this.axios.post('/department/upload', fileFormData, requestConfig).then((res) => {
              alert(res.data.msg)
            })

          }

3.后台controller如下:

@PostMapping("/upload")
	@ResponseBody
	public RespBean upload(@RequestParam("file") MultipartFile multipartFile) {
		try {
	//后台逻辑
		} 
		catch (Exception e) {
			log.error("上传excel失败");
			return RespBean.error("上传excel失败");
		}
		return null;
	}

 

4.注意,我出现了报错:no multipart boundary was found ,报错找不到multipart  file

原因是因为我的main.js里对axios的请求作了统一转换

//axios post请求全局处理参数
// axios.defaults.transformRequest = function (data) {
//   data = qs.stringify(data);
//   return data;
// };

这是对post请求参数的统一qs转换。

所以必须注释掉这个统一转换,

然后运行生效。

5.最后,注释了axios请求的参数统一转换配置axios.defaults.transformRequest,辣么vue代码中相应的axios post 请求就需要分别单独设置了,记得修改,比如:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值