a2bei4-utils 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2bei4.utils.cjs.js +3 -0
- package/dist/a2bei4.utils.cjs.js.map +1 -1
- package/dist/a2bei4.utils.cjs.min.js +1 -1
- package/dist/a2bei4.utils.cjs.min.js.map +1 -1
- package/dist/a2bei4.utils.esm.js +3 -0
- package/dist/a2bei4.utils.esm.js.map +1 -1
- package/dist/a2bei4.utils.esm.min.js +1 -1
- package/dist/a2bei4.utils.esm.min.js.map +1 -1
- package/dist/a2bei4.utils.umd.js +3 -0
- package/dist/a2bei4.utils.umd.js.map +1 -1
- package/dist/a2bei4.utils.umd.min.js +1 -1
- package/dist/a2bei4.utils.umd.min.js.map +1 -1
- package/dist/download.cjs +3 -0
- package/dist/download.cjs.map +1 -1
- package/dist/download.js +3 -0
- package/dist/download.js.map +1 -1
- package/package.json +1 -1
package/dist/download.cjs
CHANGED
|
@@ -79,6 +79,9 @@ async function fetchOrDownloadByUrl(url, fileName) {
|
|
|
79
79
|
const urlPathname = new URL(url).pathname;
|
|
80
80
|
// 获取路径的最后一部分作为文件名,并移除可能的查询参数
|
|
81
81
|
fileName = urlPathname.substring(urlPathname.lastIndexOf("/") + 1).split("?")[0];
|
|
82
|
+
if (fileName) {
|
|
83
|
+
fileName = decodeURIComponent(fileName);
|
|
84
|
+
}
|
|
82
85
|
} catch (e) {}
|
|
83
86
|
// 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳
|
|
84
87
|
if (!fileName) {
|
package/dist/download.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.cjs","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"download.cjs","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/download.js
CHANGED
|
@@ -77,6 +77,9 @@ async function fetchOrDownloadByUrl(url, fileName) {
|
|
|
77
77
|
const urlPathname = new URL(url).pathname;
|
|
78
78
|
// 获取路径的最后一部分作为文件名,并移除可能的查询参数
|
|
79
79
|
fileName = urlPathname.substring(urlPathname.lastIndexOf("/") + 1).split("?")[0];
|
|
80
|
+
if (fileName) {
|
|
81
|
+
fileName = decodeURIComponent(fileName);
|
|
82
|
+
}
|
|
80
83
|
} catch (e) {}
|
|
81
84
|
// 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳
|
|
82
85
|
if (!fileName) {
|
package/dist/download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE;AAC7C,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC1C,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7B,IAAI,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC;AACvB,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AACjB,IAAI,CAAC,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACjC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACd,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC/C,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC1C,IAAI,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACjC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,0BAA0B,EAAE;AACtF,IAAI,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC9C,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;AAC/D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE;AAC7C;AACA,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AACvD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAe,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE;AAC1D;AACA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,QAAQ,IAAI;AACZ,YAAY,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AACtD;AACA,YAAY,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACtB;AACA,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,YAAY,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC7C,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA,IAAI,IAAI;AACR,QAAQ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAC1C,YAAY,MAAM,EAAE,KAAK;AACzB,YAAY,IAAI,EAAE,MAAM;AACxB,YAAY,KAAK,EAAE,UAAU;AAC7B,SAAS,CAAC,CAAC;AACX;AACA,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC1B,YAAY,MAAM,IAAI,KAAK,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtF,QAAQ,CAAC;AACT;AACA,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C,QAAQ,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvC,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,QAAQ,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACrC,IAAI,CAAC;AACL;;;;"}
|
|
1
|
+
{"version":3,"file":"download.js","sources":["../src/source/download.js"],"sourcesContent":["/**\r\n * 通过动态创建 `<a>` 标签触发浏览器下载。\r\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\r\n *\r\n * @param {string} url - 任意可下载地址(同源或允许跨域)\r\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\r\n */\r\nexport function downloadByUrl(url, fileName) {\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.rel = \"noopener\";\r\n a.href = url;\r\n a.download = fileName || Date.now();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n}\r\n\r\n/**\r\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\r\n *\r\n * @param {Blob} blob - 待下载的 Blob(含 File)\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadByBlob(blob, fileName) {\r\n const url = URL.createObjectURL(blob);\r\n downloadByUrl(url, fileName);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n\r\n/**\r\n * 将任意数据包装成 Blob 并下载。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\r\n */\r\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\r\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\r\n}\r\n\r\n/**\r\n * 快捷下载 Excel 文件(MIME 已固定)。\r\n *\r\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadExcel(data, fileName) {\r\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\r\n}\r\n\r\n/**\r\n * 快捷下载 JSON 文件(MIME 已固定)。\r\n * 若传入非字符串数据,会自行 `JSON.stringify`。\r\n *\r\n * @param {any} data - 要序列化的 JSON 数据\r\n * @param {string} [fileName] - 保存到本地的文件名\r\n */\r\nexport function downloadJSON(data, fileName) {\r\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\r\n downloadByData(data, fileName, \"application/json\");\r\n}\r\n\r\n/**\r\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\r\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\r\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\r\n *\r\n * @param {string} url - 文件的 URL 地址\r\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\r\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\r\n */\r\nexport async function fetchOrDownloadByUrl(url, fileName) {\r\n // 如果未提供文件名,尝试从 URL 路径中提取\r\n if (!fileName) {\r\n try {\r\n const urlPathname = new URL(url).pathname;\r\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\r\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\r\n if (fileName) {\r\n fileName = decodeURIComponent(fileName);\r\n }\r\n } catch (e) {}\r\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\r\n if (!fileName) {\r\n fileName = Date.now().toString();\r\n }\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n cache: \"no-cache\"\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n downloadByBlob(blob, fileName);\r\n } catch (error) {\r\n downloadByUrl(url, fileName);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED