需求
简单需求,上传文件之后服务端处理完文件的数据,本次接口请求返回文件流,前端再把该文件流下载下来。
经过
因为项目使用了element-ui,所以理所当然的使用Upload上传组件,能正确上传文件,但是后端返回的文件流使用a链接下载了之后报文件格式错误无法打开。找了找之前下载文件的接口,发现服务端返回的格式没有任何问题,且服务端说跟之前的下载文件接口用的是同一方法,所以开始怀疑element-ui的上传组件是否文件上传之后再返回文件流下载这一场景有问题。网上搜了下,确实已经有人遇到了。
解决
看了下别人的解决思路,使用了Upload上传组件自定义上传属性http-request,自己尝试了下,解决了。
代码
HTML
最关键就是这个http-request
,其他的设置我就不写了。
<el-upload :http-request="uploadFile">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
js
//params 入参 上传文件的对应信息
uploadFile(param){
const {
file} = param;
var formData = new FormData();
//file字段名字,看服务端需要用什么名字这里就用啥
formData.append("file", file);
//发起请求 注意uploadFileApi是项目里面封装的api请求方法,看个人项目怎么封装的,我这里只是一个示例。该请求我设置了responseType:'blob'
uploadFileApi(formData).then(res => {
//拿到后端的返回的文件流之后,判断下状态,我这里把判断去掉了
let blob = new Blob([res],{
type: "application/vnd.ms-excel",
});
let link = document.createElement("a");
let href = window.URL.createObjectURL(blob);
link.href = href;
link.download = "xxx.xlsx";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(href); //释放该URL
})
},
记录下,第一次遇到。
个人水平有限,有问题欢迎大家留言指导,仅供学习和参考。
学海无涯!努力二字,共勉!