From 0c59797d5bf9a8d93462bdf05a83b41038a716fc Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 10 Feb 2026 19:39:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=94=B9=E7=94=A8=20fetch+blob=20=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=B5=8F=E8=A7=88=E5=99=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用 fetch 获取文件内容后创建 Blob URL 触发下载, 不依赖服务端 Content-Disposition 头。 Co-Authored-By: Claude Opus 4.6 --- frontend/app/agency/briefs/[id]/page.tsx | 30 +++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/frontend/app/agency/briefs/[id]/page.tsx b/frontend/app/agency/briefs/[id]/page.tsx index 44fd2b7..179ade0 100644 --- a/frontend/app/agency/briefs/[id]/page.tsx +++ b/frontend/app/agency/briefs/[id]/page.tsx @@ -417,10 +417,19 @@ export default function BriefConfigPage() { return } try { - const signedUrl = await api.getSignedUrl(file.url, 3600, true) - window.open(signedUrl, '_blank') + const signedUrl = await api.getSignedUrl(file.url) + const resp = await fetch(signedUrl) + const blob = await resp.blob() + const blobUrl = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = blobUrl + a.download = file.name + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(blobUrl) } catch { - toast.error('获取下载链接失败') + toast.error('下载失败') } } @@ -660,10 +669,19 @@ export default function BriefConfigPage() { return } try { - const signedUrl = await api.getSignedUrl(file.url, 3600, true) - window.open(signedUrl, '_blank') + const signedUrl = await api.getSignedUrl(file.url) + const resp = await fetch(signedUrl) + const blob = await resp.blob() + const blobUrl = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = blobUrl + a.download = file.name + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(blobUrl) } catch { - toast.error('获取下载链接失败') + toast.error('下载失败') } }