目录



1,前言


事情的起因是我的​​leader​​告诉我系统的合同上传出现问题了,文件上传失败,接口也没调用。我看了一下时间,​​17:15​​了,还有​​45​​分钟就要关机回家了,吓得我赶紧定位问题。

2,问题定位


公司的上传是用的​​emelent-ui​​的​​Upload​​二次封装,找到了组件源码(不是俺封装的),看了一下逻辑,发现问题出在后缀名上。客户上传的文件后缀是​​.PDF​​,而组件中未兼容大小写,在​​before-upload​​事件中就阻止了。于是我放开了大写后缀,哦豁,文件上传接口居然也不支持大写,跑去问后端,告诉我要统一小写,不能放开大写。没办法,那就自己修改一下吧。

3,实现


发现​​Upload​​中,在​​before-upload​​直接修改​​file​​是不行的,因为是只读属性。所以我采用了手动上传

3.1,before-upload回调

在回调中,我们可以拿到​​file​​参数,这个就是我们上传的文件,定义一个变量​​nama​​,值为​​toLowerCase​​转换成小写的文件名,通过​​new File​​创建一个file对象,名字就是转换后的​​name​

// 上传之前的回调
handleBeforeUpload(file) {
const littleName = file.name.toLowerCase()
const copyFile = new File([file], littleName)
this.handlePddUploadFile(copyFile)
return false
}
}


3.2,自定义上传

这里我们新建一个​​form​​对象,携带我们的额外参数

// 自定义的上传form
handlePddUploadFile(copyFile) {
const formdata = new FormData()
formdata.append('file', copyFile)
formdata.append('save_org_name', this.data.save_org_name)
formdata.append('behavior', this.data.behavior)
formdata.append('uploadFile', this.data.uploadFile)
formdata.append('safe', this.data.safe)
this.handlePddPostForm(formdata)
}


然后调用​​axios​​实现上传

async handlePddPostForm(formdata) {
try{
const res = await axios.post(this.action, formdata, {
headers: this.headers
})
this.handleUploadSuccess(res.data)
} catch (error) {
Top.alert(error)
}
}