最近在做项目的时候,有一个批量上传内容的需求,上传的是一个excel文档。返回值也是一个Excel文档。我这边之前的做法是直接搞个表单,把相关的字段填好,发送就可以了。但是其实这是从一个弹窗里面submit的,使用...
最近在做项目的时候,有一个批量上传内容的需求,上传的是一个excel文档。返回值也是一个Excel文档。
我这边之前的做法是直接搞个表单,把相关的字段填好,发送就可以了。
但是其实这是从一个弹窗里面submit的,使用表单的话,就监控不到上传的进度,也就不知道啥时候关闭弹窗,于是产品就问了,这个怎么解决呀,我是等了三秒后直接关闭,但是这样子感觉很low,就想能不能通过ajax来做呢,下面是表单的写法
<form ref="uploadForm" :action="actionUrl" method="post" enctype="multipart/form-data" v-if="operator">
<label for="upfile" class="pTitleRight">
<span>Content</span>
<el-button type="primary" @click="clickHandle">Upload File</el-button>
<span>{{fileName}}</span>
<input ref="filElem" type="file" id="upfile" name="file" style="display: none;" @change="upload" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
</label>
<input type="text" name="zone" value="sa" hidden>
<input type="text" name="operator" :value="operator.name" hidden>
<input type="text" name="userId" :value="operator.id" hidden>
</form>
下面是ajax的写法了,
重要的是需要设置返回的类型,选择blob,这样就可以构造a标签来自动下载了。
submit() {
this.loading = true;
const formData = new FormData();
formData.append('file', this.file);
formData.append('zone', 'sa');
formData.append('operator', this.operator.name);
formData.append('userId', this.operator.id);
const config = {
headers: {
'Content-Type': 'multipart/form-data',
},
withCredentials: true,
responseType: 'blob',
};
const fileName = 'import_sbcms_result';
axios.post(this.actionUrl, formData, config).then((res) => {
this.loading = false;
this.close();
this.$emit('addSuccess');
this.$refs.filElem.value = '';
const blob = res.data;
// 如果size小于100,一般是报错了
if (blob.size < 100) {
const reader = new FileReader();
reader.readAsText(res.data, 'utf-8');
reader.onload = (e) => {
this.$message({
showClose: true,
message: JSON.parse(e.target.result).message,
type: 'error',
});
};
return;
}
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, fileName);
} else {
const downloadLink = window.document.createElement('a');
// const contentTypeHeader = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
const contentTypeHeader = res.headers['content-type'];
downloadLink.href = window.URL.createObjectURL(new Blob([blob], { type: contentTypeHeader }));
downloadLink.download = fileName;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
}).catch((e) => {
this.$message.error(e);
});
织梦狗教程
本文标题为:axios通过formData上传文件,然后在下载文件
基础教程推荐
猜你喜欢
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
- Flutter手势密码的实现示例(附demo) 2023-04-11
- Android中的webview监听每次URL变化实例 2023-01-23
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- Android多返回栈技术 2023-04-15
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- android studio按钮监听的5种方法实例详解 2023-01-12
