giime 0.7.23 → 0.7.24

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.
@@ -1 +1 @@
1
- export declare const version = "0.7.23";
1
+ export declare const version = "0.7.24";
@@ -1,4 +1,4 @@
1
- const version = "0.7.22";
1
+ const version = "0.7.24";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=version.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.7.22';\n"],"names":[],"mappings":"AAAO,MAAM,OAAU,GAAA;;;;"}
1
+ {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.7.24';\n"],"names":[],"mappings":"AAAO,MAAM,OAAU,GAAA;;;;"}
@@ -4,6 +4,8 @@ import { GmNotification } from '../../../components/src/plugins/notification/ind
4
4
  import { v4 } from 'uuid';
5
5
  import JSZip from 'jszip';
6
6
  import { GmMessage } from '../../../components/src/plugins/message/index.mjs';
7
+ import '../../../utils/index.mjs';
8
+ import { isString } from '../../../utils/src/is.mjs';
7
9
 
8
10
  const useDownload = () => {
9
11
  const getUrlFilename = (url) => {
@@ -29,12 +31,7 @@ const useDownload = () => {
29
31
  }
30
32
  };
31
33
  const downloadByRes = async (res, options) => {
32
- let contentDispositionName = (res?.headers?.["content-disposition"] || res?.headers?.["Content-Disposition"])?.split("filename=")[1];
33
- try {
34
- contentDispositionName = decodeURIComponent(contentDispositionName);
35
- } catch {
36
- }
37
- const filename = options?.filename || contentDispositionName || "file";
34
+ const filename = options?.filename || getFileNameFromContentDisposition(res?.headers?.["content-disposition"] || res?.headers?.["Content-Disposition"]);
38
35
  const resBlob = await res.data;
39
36
  const curId = v4();
40
37
  const modalInfo = GmNotification({
@@ -220,6 +217,26 @@ const editElementContent = (className, content) => {
220
217
  currentEle.innerHTML = content;
221
218
  }
222
219
  };
220
+ const getFileNameFromContentDisposition = (disposition) => {
221
+ if (!disposition || !isString(disposition)) {
222
+ return "file";
223
+ }
224
+ const normalized = disposition.replace(/\s+/g, "");
225
+ try {
226
+ const rfc5987Match = normalized.match(/filename\*=UTF-8''([^;]+)/i);
227
+ if (rfc5987Match) {
228
+ return decodeURIComponent(rfc5987Match[1]);
229
+ }
230
+ const standardMatch = normalized.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/i);
231
+ if (standardMatch) {
232
+ return decodeURIComponent(standardMatch[1].replace(/['"]/g, ""));
233
+ }
234
+ return "file";
235
+ } catch (error) {
236
+ console.error(error);
237
+ return "filename-error";
238
+ }
239
+ };
223
240
 
224
241
  export { useDownload };
225
242
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n const getUrlFilename = (url: string) => {\n const filename = url.split('/').pop()?.split('?')[0] || 'file';\n return filename;\n };\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n let contentDispositionName = (res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition'])?.split('filename=')[1];\n try {\n contentDispositionName = decodeURIComponent(contentDispositionName);\n } catch {}\n const filename = options?.filename || contentDispositionName || 'file';\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: currentItem.filename ?? getUrlFilename(currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 确保文件名不为空,优先使用传入的filename,否则从URL提取\n const finalFilename = item.filename || getUrlFilename(item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n const getUrlFilename = (url: string) => {\n const filename = url.split('/').pop()?.split('?')[0] || 'file';\n return filename;\n };\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: currentItem.filename ?? getUrlFilename(currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 确保文件名不为空,优先使用传入的filename,否则从URL提取\n const finalFilename = item.filename || getUrlFilename(item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const version = "0.7.23";
1
+ export declare const version = "0.7.24";
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const version = "0.7.22";
3
+ const version = "0.7.24";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.7.22';\n"],"names":[],"mappings":";;AAAO,MAAM,OAAU,GAAA;;;;"}
1
+ {"version":3,"file":"version.js","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.7.24';\n"],"names":[],"mappings":";;AAAO,MAAM,OAAU,GAAA;;;;"}
@@ -6,6 +6,8 @@ var index = require('../../../components/src/plugins/notification/index.js');
6
6
  var uuid = require('uuid');
7
7
  var JSZip = require('jszip');
8
8
  var index$1 = require('../../../components/src/plugins/message/index.js');
9
+ require('../../../utils/index.js');
10
+ var is = require('../../../utils/src/is.js');
9
11
 
10
12
  const useDownload = () => {
11
13
  const getUrlFilename = (url) => {
@@ -31,12 +33,7 @@ const useDownload = () => {
31
33
  }
32
34
  };
33
35
  const downloadByRes = async (res, options) => {
34
- let contentDispositionName = (res?.headers?.["content-disposition"] || res?.headers?.["Content-Disposition"])?.split("filename=")[1];
35
- try {
36
- contentDispositionName = decodeURIComponent(contentDispositionName);
37
- } catch {
38
- }
39
- const filename = options?.filename || contentDispositionName || "file";
36
+ const filename = options?.filename || getFileNameFromContentDisposition(res?.headers?.["content-disposition"] || res?.headers?.["Content-Disposition"]);
40
37
  const resBlob = await res.data;
41
38
  const curId = uuid.v4();
42
39
  const modalInfo = index.GmNotification({
@@ -222,6 +219,26 @@ const editElementContent = (className, content) => {
222
219
  currentEle.innerHTML = content;
223
220
  }
224
221
  };
222
+ const getFileNameFromContentDisposition = (disposition) => {
223
+ if (!disposition || !is.isString(disposition)) {
224
+ return "file";
225
+ }
226
+ const normalized = disposition.replace(/\s+/g, "");
227
+ try {
228
+ const rfc5987Match = normalized.match(/filename\*=UTF-8''([^;]+)/i);
229
+ if (rfc5987Match) {
230
+ return decodeURIComponent(rfc5987Match[1]);
231
+ }
232
+ const standardMatch = normalized.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/i);
233
+ if (standardMatch) {
234
+ return decodeURIComponent(standardMatch[1].replace(/['"]/g, ""));
235
+ }
236
+ return "file";
237
+ } catch (error) {
238
+ console.error(error);
239
+ return "filename-error";
240
+ }
241
+ };
225
242
 
226
243
  exports.useDownload = useDownload;
227
244
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n const getUrlFilename = (url: string) => {\n const filename = url.split('/').pop()?.split('?')[0] || 'file';\n return filename;\n };\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n let contentDispositionName = (res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition'])?.split('filename=')[1];\n try {\n contentDispositionName = decodeURIComponent(contentDispositionName);\n } catch {}\n const filename = options?.filename || contentDispositionName || 'file';\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: currentItem.filename ?? getUrlFilename(currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 确保文件名不为空,优先使用传入的filename,否则从URL提取\n const finalFilename = item.filename || getUrlFilename(item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n"],"names":["uuidv4","GmNotification","h","ref","res","GmMessage"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n const getUrlFilename = (url: string) => {\n const filename = url.split('/').pop()?.split('?')[0] || 'file';\n return filename;\n };\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: currentItem.filename ?? getUrlFilename(currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 确保文件名不为空,优先使用传入的filename,否则从URL提取\n const finalFilename = item.filename || getUrlFilename(item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n"],"names":["uuidv4","GmNotification","h","ref","res","GmMessage","isString"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "giime",
3
- "version": "0.7.23",
3
+ "version": "0.7.24",
4
4
  "description": "A Component Library for Vue 3",
5
5
  "keywords": [
6
6
  "giime",