smart_platform_web/src/utils/download.js

110 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
import { Loading, Message } from 'element-ui'
import { getToken } from '@/utils/auth'
import { blobValidate } from '@/utils/bonus'
import { saveAs } from 'file-saver'
// 下载blob文件
export const downloadFile = ({ fileData, fileType, fileName }) => {
const blob = new Blob([fileData], {
type: fileType
})
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = fileName
link.style.display = 'none'
document.body.appendChild(link)
link.click()
URL.revokeObjectURL(link.href)
document.body.removeChild(link)
}
// 通用a链接下载
export const downloadFileByUrl = (url) => {
const link = document.createElement('a')
link.href = url
link.setAttribute('download', '')
link.style.display = 'none'
document.body.appendChild(link)
link.click()
URL.revokeObjectURL(link.href)
document.body.removeChild(link)
}
/**
* 通用文件下载方法(带加载提示)
* @param {string} path - 下载路径
* @param {string} defaultFileName - 默认文件名(可选,如果响应头没有文件名则使用此名称)
* @param {string} loadingText - 加载提示文本(可选,默认为'正在下载文件,请稍候...'
* @returns {Promise} - 返回 Promise
*/
export const downloadFileWithLoading = (path, defaultFileName = '文件.xlsx', loadingText = '正在下载文件,请稍候...') => {
const baseURL = process.env.VUE_APP_BASE_API
const url = path.startsWith('http') ? path : `${baseURL}/${path}`
// 显示下载中提示(优化样式)
const downloadLoadingInstance = Loading.service({
lock: true, // 锁定屏幕,防止用户操作
text: loadingText,
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.1)', // 稍微降低透明度,更柔和
customClass: 'download-loading-mask' // 自定义样式类
})
return axios({
method: 'get',
url: url,
responseType: 'blob',
headers: {
'Authorization': 'Bearer ' + getToken(),
'encryptResponse':false
}
}).then((res) => {
console.log('res',res)
// 验证是否为blob格式
const isBlob = blobValidate(res.data)
if (isBlob) {
// 从响应头获取文件名,如果没有则使用默认名称
const fileName = res.headers['download-filename']
? decodeURIComponent(res.headers['download-filename'])
: defaultFileName
// 创建blob并下载
const blob = new Blob([res.data], {
type: res.data.type || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
saveAs(blob, fileName)
Message.success('文件下载成功')
return Promise.resolve(fileName)
} else {
// 如果不是blob尝试解析错误信息
return printErrMsg(res.data)
}
}).catch((error) => {
console.error('文件下载失败:', error)
Message.error('文件下载失败,请稍后重试')
return Promise.reject(error)
}).finally(() => {
// 关闭加载提示
if (downloadLoadingInstance) {
downloadLoadingInstance.close()
}
})
}
/**
* 打印错误信息
* @param {Blob} data - 错误响应的blob数据
*/
async function printErrMsg(data) {
try {
const resText = await data.text()
const rspObj = JSON.parse(resText)
Message.error(rspObj.msg || '下载失败,请稍后重试')
return Promise.reject(new Error(rspObj.msg || '下载失败'))
} catch (e) {
Message.error('下载失败,请稍后重试')
return Promise.reject(e)
}
}