前言
最新项目需要实现一个上传 excel 表格的功能,由于项目使用了 element-ui 作为 UI 框架,所以心里满心欢喜的开始使用 el-upload 来上传文件。之后很迅速的根据 element-ui 文档实现了上传的代码:
1 | <el-upload |
果然很完美的上传成功了…
突然发现,咦,需要实现带有进度条的上传,认真翻看了一下 element-ui 的文档,发现并没有什么方法可以快速自定义的实现上传的进度条,看来只能使用自定义上传了。
使用 el-upload 自定义上传文件
很快速的使用 :before-upload=”beforeAvatarUpload” 自定义了上传方法,方法代码很简单,这里利用 FromData 对象进行上传,都知道要设置headers中的 content-type 为 multipart/form-data:
1 | axios.post(url, fd, { |
先测试了一下上传能不能成功~,结果发现,居然失败了:
到这里,又尝试的修改了一些参数的传递方法等各种,最后都失败了,结果差不多….
尝试用原生的 input 来上传文件
由于尝试了很多次,都没有成功,不知道哪里出了问题,所以开始尝试上传方法 beforeAvatarUpload 里用原生的 ajax 来上传文件, 大致代码如下:
1 | let xhr = new XMLHttpRequest() |
结果是: 没有问题,上传成功了…
到这里,可以说明是 axios 这边产生了某些问题了。 马上开始搜索解决方案,找到了一个解决思路,就是:axios拦截了请求,对请求的数据做了一些处理,而 FormData 传输文件不需要任何的处理。所以就在想直接在 axios 上过载一个方法,躲过 axios 的拦截。
解决问题
在仔细的查看 axios 文档后,发现文档中有一个创建实例 (Creating an instance) 的方法 axios.create([config]) ,最终解决问题,代码大致为:
1 | // 上传报表操作 |
有些同学可能不知道上传文件为什么要设置headers中的 content-type 为 multipart/form-data,大家可以看看这篇文章:
HTTP请求中 request payload 和 formData 区别?