From 3ea1e0ccbb2a0f8fc5046571604518cec8c46919 Mon Sep 17 00:00:00 2001 From: jahnli Date: Fri, 27 Sep 2024 00:48:29 +0800 Subject: [PATCH 1/2] feat(n-image): `download` method support local file --- CHANGELOG.en-US.md | 4 ++++ CHANGELOG.zh-CN.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md index 32d612261b3..fb6e30133ec 100644 --- a/CHANGELOG.en-US.md +++ b/CHANGELOG.en-US.md @@ -4,6 +4,10 @@ `2024-09-26` +### Features + +- `n-image` `download` support method local file, close [#6394](https://github.com/tusen-ai/naive-ui/issues/6394) + ### Fixes - Fix `n-data-table` in virtual-x mode, when all column objects do not have the `fixed` attribute configured, it cannot be displayed normally. diff --git a/CHANGELOG.zh-CN.md b/CHANGELOG.zh-CN.md index 67a65a4b8b0..db30af8028b 100644 --- a/CHANGELOG.zh-CN.md +++ b/CHANGELOG.zh-CN.md @@ -4,6 +4,10 @@ `2024-09-26` +### Features + +- `n-image` `download` 方法支持本地文件,关闭 [#6394](https://github.com/tusen-ai/naive-ui/issues/6394) + ### Fixes - 修复 `n-data-table` 在设定 `virtual-x`,且所有的 column 对象均没有配置 `fixed` 属性的时候无法正常显示 From 03b32f800d0ede47d93fbc9047fb6e123cd8b337 Mon Sep 17 00:00:00 2001 From: jahnli Date: Fri, 27 Sep 2024 00:49:40 +0800 Subject: [PATCH 2/2] feat: add file --- src/_utils/dom/download.ts | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/_utils/dom/download.ts b/src/_utils/dom/download.ts index cece1d5461a..16a5d9e1320 100644 --- a/src/_utils/dom/download.ts +++ b/src/_utils/dom/download.ts @@ -6,7 +6,30 @@ export function download(url: string | null, name: string | undefined): void { if (name !== undefined) { a.download = name } - document.body.appendChild(a) - a.click() - document.body.removeChild(a) + else { + const urlWithoutQuery = url.split('?')[0] + const parts = urlWithoutQuery.split('/') + const filename = parts[parts.length - 1] + a.download = filename + } + if (url.startsWith('http') || url.startsWith('blob')) { + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + } + else { + fetch(url) + .then(res => res.blob()) + .then((blob) => { + const objectUrl = URL.createObjectURL(blob) + a.href = objectUrl + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(objectUrl) + }) + .catch((err) => { + console.error('Error fetching file:', err) + }) + } }