Element-UI解决跨域上传问题(:http-request)

本文介绍如何在Vue应用中处理通过XMLHttpRequest上传图片时遇到的跨域问题,提供了一个不依赖于proxy或with-credentials的解决方案,重点在前端代码实现和JSON解析上。

书写本文的起因是在使用若依前后端分离框架过程中需要进行图片上传的操作,但是本机前端上传的图片是发送给服务器的后端接口,后端接口返回对应的json字符串,涉及到跨域上传问题,这里给出一个解决方案(因为其它设置例如:在配置文件config 里面增加代理的方式、 with-credentials=“true”等没有作用)

vue代码

script:
利用XMLHttpRequest实现的数据回传

uploadFile(param) {
      var that = this;//避免this指针在后面的请求以后改变
      var fileObj = param.file;
      // this.uploadAction是接收上传文件的后台地址
      var FileController = this.uploadAction;
      // FormData 对象
      var forms = new FormData();
      // 文件对象
      forms.append("file", fileObj);
      // XMLHttpRequest 对象
      var xhr = new XMLHttpRequest();
      xhr.open("post", FileController, true);
      xhr.onload = function () {
        var strData =  xhr.response;//回传的数据接受
        var jsonData = JSON.parse(strData);//这里由于后端接口返回的是String,而后面需要的是json
        that.form.mark1 = jsonData["data"];//取出json中对应需要的数据存入form表单中
      };
      xhr.send(forms);
    }

下面是template:

	<el-form-item label="图片"  prop="mark1">
       <el-upload
         :action="uploadAction"
         :show-file-list="false"
         :before-upload="beforeAvatarUpload"
         name="upfile"
         :http-request="uploadFile"
         :auto-upload="true">
         <img v-if="form.mark1" :src="form.mark1" class="imagesDetail">
         <i v-else class="el-icon-plus avatar-uploader-icon" ></i>
       </el-upload>
    </el-form-item>

:action是后端目标接口地址,但是由于使用了:http-request,所以这里填什么都无所谓了。另外我这里form.mark1用于存放图片地址。

Element-UI 中实现上传按钮功能,并在访问指定接口后接收 JSON 数据并弹出对话框展示其中的文本内容,可以通过以下方式完成: ### 三级标题:Element-UI 文件上传组件使用 Element-UI 提供了 `el-upload` 组件用于实现文件上传功能。该组件支持多种上传模式,包括手动上传、自动上传等。通过设置 `action` 属性为 `http://10.193.107.225:5000`,可以将文件直接上传至目标接口地址。此外,可通过 `before-upload` 或 `http-request` 自定义上传逻辑,以满足、携带 token 等高级需求。 ```vue <template> <div> <el-upload class="upload-demo" action="http://10.193.107.225:5000" :on-success="handleSuccess" :before-upload="beforeUpload" :show-file-list="false"> <el-button type="primary">点击上传</el-button> </el-upload> </div> </template> ``` ### 三级标题:自定义上传逻辑与数据解析 若需要对上传过程进行更精细控制,可使用 `http-request` 替换默认的上传行为。例如,使用 `axios` 发送请求,并在成功响应后获取 JSON 数据。同时,可在 `before-upload` 方法中验证文件格式或大小限制。 ```vue <script> import axios from 'axios'; export default { methods: { beforeUpload(file) { const isValidType = file.type === 'application/pdf' || file.type === 'image/jpeg'; if (!isValidType) { alert('只能上传 PDF 或 JPEG 文件'); } return isValidType; }, async handleSuccess(response, file, fileList) { this.$alert(JSON.stringify(response), '服务器返回数据', { confirmButtonText: '确定', }); } } }; </script> ``` ### 三级标题:弹窗展示 JSON 数据 Element-UI 提供了 `$alert` 方法用于快速创建提示对话框。在文件上传成功后,可调用该方法将服务器返回的 JSON 数据以弹窗形式展示给用户。这种方式避免了引入额外弹窗插件的需求,提高了开发效率。 ```javascript this.$alert(JSON.stringify(response), '服务器返回数据', { confirmButtonText: '确定', }); ``` ### 三级标题:与请求头配置 服务端通常根据请求头中的 `Content-Type` 字段判断消息主体的编码方式,并据此解析数据[^3]。因此,在上传文件时,需确保请求头正确设置为 `multipart/form-data`。如果存在问题,还需在后端配置 CORS 支持,或在前端使用代理。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值