54 lines
1.9 KiB
Plaintext
54 lines
1.9 KiB
Plaintext
import { request } from '@/utils/request'; // 假设这是你的请求函数
|
|
import { ElMessage } from 'element-plus'; // Element Plus 的消息组件
|
|
import { t } from '@/locales'; // 国际化函数
|
|
import { saveFileByWebApi, saveFileByElementA } from '@/utils/file'; // 文件保存工具函数
|
|
|
|
const downloadFile = (id: number) => {
|
|
request({
|
|
url: '/admin/file/download',
|
|
method: 'get',
|
|
params: {
|
|
id,
|
|
},
|
|
responseType: 'blob'
|
|
}).then((response: any) => {
|
|
const contentDisposition = response.headers?.['content-disposition'] || '';
|
|
let filename = 'file';
|
|
|
|
try {
|
|
// 先尝试获取 filename* 参数
|
|
const filenameStarMatch = contentDisposition.match(/filename\*=UTF-8''([^;]*)/);
|
|
if (filenameStarMatch) {
|
|
filename = decodeURIComponent(filenameStarMatch[1]);
|
|
} else {
|
|
// 如果没有 filename*,则尝试获取普通 filename
|
|
const filenameMatch = contentDisposition.match(/filename="([^"]*)"/) || contentDisposition.match(/filename=([^;]*)/);
|
|
if (filenameMatch) {
|
|
filename = filenameMatch[1];
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.warn('解析文件名失败:', error);
|
|
// 如果解析失败,使用默认文件名
|
|
filename = `download_${id}`;
|
|
}
|
|
|
|
// @ts-ignore
|
|
if (window.showSaveFilePicker) {
|
|
saveFileByWebApi(response.data, filename).catch(() => {
|
|
saveFileByElementA(response.data, filename).catch(() => {
|
|
ElMessage.error(t('admin.fileView.download_fail'));
|
|
});
|
|
});
|
|
} else {
|
|
saveFileByElementA(response.data, filename).catch(() => {
|
|
ElMessage.error(t('admin.fileView.download_fail'));
|
|
});
|
|
}
|
|
}).catch(error => {
|
|
console.error('下载文件失败:', error);
|
|
ElMessage.error(t('admin.fileView.download_fail'));
|
|
});
|
|
};
|
|
|
|
export default downloadFile; |