Files
filecodebox/path/to/frontend/file
T

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;