fix: 修复S3备份下载URL生成逻辑并导出API基础URL函数

- 导出`getApiBaseUrl`函数以便复用
- 修改`downloadS3BackupUrl`函数,使其使用正确的API基础URL
- 重构S3备份下载处理,使用fetch API并添加授权头,支持blob下载
This commit is contained in:
anghunk
2026-02-12 16:30:15 +08:00
parent 3cfa5f1f6a
commit ca58ae7caf
3 changed files with 35 additions and 6 deletions

View File

@@ -424,5 +424,9 @@ export function deleteS3Backup(key: string): Promise<{ message: string }> {
}
export function downloadS3BackupUrl(key: string): string {
return `/admin/backup/s3/download?key=${encodeURIComponent(key)}`;
const rawEnvApiBaseUrl = (import.meta.env.VITE_API_BASE_URL || '').trim();
const stored = (localStorage.getItem('cwd_admin_api_base_url') || '').trim();
const source = stored || rawEnvApiBaseUrl;
const apiBaseUrl = source.replace(/\/+$/, '');
return `${apiBaseUrl}/admin/backup/s3/download?key=${encodeURIComponent(key)}`;
}

View File

@@ -1,6 +1,6 @@
const rawEnvApiBaseUrl = (import.meta.env.VITE_API_BASE_URL || '').trim();
function getApiBaseUrl(): string {
export function getApiBaseUrl(): string {
const stored = (localStorage.getItem('cwd_admin_api_base_url') || '').trim();
const source = stored || rawEnvApiBaseUrl;
const apiBaseUrl = source.replace(/\/+$/, '');

View File

@@ -57,9 +57,9 @@ import { useI18n } from "vue-i18n";
import {
fetchS3BackupList,
deleteS3Backup,
downloadS3BackupUrl,
S3BackupItem,
} from "../../../api/admin";
import { getApiBaseUrl } from "../../../api/http";
const props = defineProps<{
visible: boolean;
@@ -83,9 +83,34 @@ const handleClose = () => {
emit("close");
};
const handleDownload = (key: string) => {
const url = downloadS3BackupUrl(key);
window.open(url, "_blank");
const handleDownload = async (key: string) => {
try {
const apiBaseUrl = getApiBaseUrl();
const token = localStorage.getItem('cwd_admin_token');
const url = `${apiBaseUrl}/admin/backup/s3/download?key=${encodeURIComponent(key)}`;
const res = await fetch(url, {
method: 'GET',
headers: token ? { 'Authorization': `Bearer ${token}` } : {},
});
if (!res.ok) {
throw new Error(`下载失败: ${res.status} ${res.statusText}`);
}
const blob = await res.blob();
const fileName = key;
const a = document.createElement('a');
a.href = window.URL.createObjectURL(blob);
a.download = fileName;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(a.href);
document.body.removeChild(a);
} catch (e: any) {
console.error('Download error:', e);
}
};
const handleDelete = async (key: string) => {