vue弹窗中有一个点击事件,点击文件名即可下载文件,点击会弹出浏览器的弹窗选择路径,点击保存之后页面中出现下载的实时进度条,当进度为100%的时候文件下载完成,弹出messaget提示“文件下载成功”,给我一段详细的代码
时间: 2024-03-17 19:41:24 浏览: 100
vue-以文件流-blob-的形式-下载-导出文件操作
好的,下面是一个实现该需求的示例代码:
HTML部分:
```
<template>
<div>
<button @click="showModal">打开弹窗</button>
<Modal v-model="visible">
<div slot="header">
文件下载
</div>
<div>
<a :href="fileUrl" ref="downloadLink" style="display: none;"></a>
<button @click="downloadFile">下载文件</button>
<div v-if="showProgress" class="progress">
<div class="progress-bar" :style="{width: progress + '%'}"></div>
</div>
</div>
</Modal>
</div>
</template>
```
其中,Modal是一个弹窗组件,fileUrl是文件下载的链接,showProgress表示是否显示进度条,progress表示当前下载进度。
JavaScript部分:
```
<script>
import Modal from 'components/Modal';
export default {
components: {
Modal,
},
data() {
return {
visible: false, // 弹窗是否显示
fileUrl: '', // 文件下载链接
showProgress: false, // 是否显示进度条
progress: 0, // 当前下载进度
};
},
methods: {
showModal() {
this.visible = true;
},
downloadFile() {
// 发送文件下载请求
const fileName = 'example.pdf'; // 文件名
this.$http.get(`/api/download?fileName=${fileName}`, {
responseType: 'blob',
onDownloadProgress: (event) => {
// 更新下载进度
this.showProgress = true;
this.progress = Math.round((event.loaded / event.total) * 100);
},
}).then((res) => {
// 创建虚拟a标签,将后端返回的文件流绑定到该标签上
const url = window.URL.createObjectURL(new Blob([res.data]));
this.fileUrl = url;
this.$refs.downloadLink.href = url;
this.$refs.downloadLink.download = fileName;
// 模拟用户点击a标签,弹出浏览器的弹窗选择路径,点击保存之后,浏览器会自动下载该文件
this.$refs.downloadLink.click();
// 下载完成,弹出提示框
this.showProgress = false;
this.progress = 0;
this.$message.success('文件下载成功');
});
},
},
};
</script>
<style scoped>
.progress {
height: 20px;
background-color: #f5f5f5;
border-radius: 4px;
overflow: hidden;
}
.progress-bar {
height: 100%;
background-color: #409eff;
transition: width 0.6s ease;
}
</style>
```
其中,$http是vue-resource库提供的http请求方法,可以根据具体的项目需要进行调整。在响应类型中设置为blob,表示返回的数据为二进制流。onDownloadProgress是xhr对象的进度回调函数,用来更新下载进度。
以上是一个简单的vue文件下载实现,具体的代码还需要根据具体的项目需求进行调整。
阅读全文