AIoT前端公共UI

Download.vue 2.6KB

    <!-- * @Author: Devin * @Date: 2023-02-20 14:23:49 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:51:24 * @Description: --> <template> <el-button @click.stop="handelDownload">{{ downloadLabel }}</el-button> </template> <script setup lang="ts"> const emits = defineEmits(['downloadSucc']); const props = defineProps({ downloadLabel: { type: String, default: () => '下载' }, type: { type: String, default: () => 'blob' }, url: { type: String, default: () => '' }, fileType: { type: String, default: () => 'excel' }, blob: { type: Object, default: () => {} }, fileName: { type: String, default: () => '' } }); // 下载excel文件 function downloadExcel() { const blob = new Blob([props.blob.data], { type: 'application/vnd.ms-excel application/x-excel;charset=utf-8' }); const downloadElement = document.createElement('a'); const href = window.URL.createObjectURL(blob); // 创建下载的链接 const fileName = props.fileName ? props.fileName : decodeURI( props.blob?.headers['content-disposition'].split('fileName=')[1] ); downloadElement.href = href; downloadElement.download = fileName; // 下载后文件名 document.body.appendChild(downloadElement); downloadElement.click(); // 点击下载 document.body.removeChild(downloadElement); // 下载完成移除元素 window.URL.revokeObjectURL(href); // 释放掉blob对象 emits('downloadSucc'); } // 下载zip文件 function downloadZip() { const downloadElement = document.createElement('a'); const blobData = props.blob.data; const href = window.URL.createObjectURL(blobData); // 创建下载的链接 downloadElement.href = href; downloadElement.download = props.fileName; // 下载后文件名 document.body.appendChild(downloadElement); downloadElement.click(); // 点击下载 document.body.removeChild(downloadElement); // 下载完成移除元素 window.URL.revokeObjectURL(href); // 释放掉blob对象 emits('downloadSucc'); } // 下载blob类型 function downloadBlob() { switch (props.fileType) { case 'excel': downloadExcel(); break; case 'zip': downloadZip(); break; default: break; } } // 下载路径类型 function downloadUrl() { window.open(props.url); } function handelDownload() { switch (props.type) { case 'blob': downloadBlob(); break; case 'url': downloadUrl(); break; default: break; } } </script> <script lang="ts"> export default { name: 'CommonDownload' }; </script> <style scoped lang="scss"></style>