首先,我的需求是通过导入excel文件实现批量添加数据,因为使用的是开源项目,前端使用element+vue来实现,所以上传文件就使用element的上传组件el-upload来实现。因为我要在上传文件的同时添加其它参数并且这个参数还是需要判断的,原生的el-upload就不支持这个操作,所以我使用它的http-request属性,实现自定义上传文件。我后端使用的是springboot 上传框架选择的是easypoi,感兴趣的可以一起探讨一下。这里有个问题 就是 为什么不用 on-success函数,因为on-success函数返回的response里面没有headers,会导致我在返回值里面不能拿headers进行判断,又因为我们在axios里面设置了responseType为blob类型,不论成功还是失败都会返回blob类型,而我又不想在后台直接抛出异常,所以采用自定义的方式来实现upload功能。
html代码:
<el-upload
class="upload-demo"
action="no"
:http-request="handleUpload"
:before-upload="beforeUpload"
:before-remove="beforeRemove"
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList"
ref="upload">
<el-button size="small" type="success" :loading="loadingApply"
class="el-icon-upload" >点击上传excel</el-button>
</el-upload>
data(){
uploadFile: undefined
}
//在上传之前把文件存一下
beforeUpload(file){
this.uploadFile = file
},
//上传操作调用的函数
handleUpload(file){
//业务操作可以忽略
//核心操作是新建formData 然后把file添加进去如果有其它参数继续添加就行
//let formData = new FormData();
//formData.append('file', self.uploadFile)
//self.upload(formData) 这里如果不进行业务处理的话可以直接调用axios调用后台接口,我这边返回值比较多所以进行了拆分
let self = this
self.loadingApply=true
let formData = new FormData();
formData.append('file', self.uploadFile)
if(self.form1.type==0){
formData.append('orgType',0)
self.upload(formData)
}
if(self.form1.orgId){
formData.append('orgId',self.form1.orgId)
self.upload(formData)
}
},
upload(formData){
let self=this
uploadExcel(formData).then(
response=>{
//我这边的业务情况是如果错误的话需要返回导入失败的数据 例如:导入5条 失败2条
//返回一个导入失败的excel里面是这两条数据 这边判断我使用的是自定义的请求头
if(response.headers['custom-status']==2){
self.msgWarn("请查看导入失败的数据")
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
// 获取文件名
const fileName = response.headers['content-disposition'].split(';')[1].split('=')[1]
// download 属性定义了下载链接的地址而不是跳转路径
link.setAttribute('download', fileName)
document.body.appendChild(link)
link.click()
}else{
self.msgSuccess("导入成功")
}
})
},
axios代码:
// axios代码 上传请求
export function uploadExcel(param) {
return request({
url: 'xxxx/uploadExcel',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: param,
responseType: 'blob'
})
}
网友评论