{"id":18930824,"url":"https://github.com/onlymisaky/download","last_synced_at":"2025-10-12T18:06:01.357Z","repository":{"id":57133269,"uuid":"406442460","full_name":"onlymisaky/download","owner":"onlymisaky","description":"download file , 下载文件","archived":false,"fork":false,"pushed_at":"2022-02-17T07:34:20.000Z","size":174,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-12T18:04:11.634Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/onlymisaky.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-14T16:24:43.000Z","updated_at":"2021-11-09T16:31:29.000Z","dependencies_parsed_at":"2022-09-03T15:02:40.718Z","dependency_job_id":null,"html_url":"https://github.com/onlymisaky/download","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/onlymisaky/download","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onlymisaky%2Fdownload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onlymisaky%2Fdownload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onlymisaky%2Fdownload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onlymisaky%2Fdownload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/onlymisaky","download_url":"https://codeload.github.com/onlymisaky/download/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onlymisaky%2Fdownload/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279012471,"owners_count":26085131,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T11:39:06.889Z","updated_at":"2025-10-12T18:06:01.343Z","avatar_url":"https://github.com/onlymisaky.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# download \n\n\u003e 使用 nodejs 下载文件，受 [download](https://github.com/kevva/download) 启发。\n\n支持多个同时下载，多线程下载，自动解析文件名称和扩展名。\n\n## 安装\n\n\u003e 由于 npm 不允许包名中含有单独的 download 字母，否则无法发布，所以命名为 `downloads`\n\n```bash\nnpm i @onlymisaky/downloads\n```\n\n## 用法\n\n## 单个文件下载\n\n[examples/single-download.ts](https://github.com/onlymisaky/download/blob/master/examples/single-download.ts)\n\n```ts\n// 下载到当前目录，根据 content-disposition 或 url 自动设置文件名\nawait download('https://avatars.githubusercontent.com/u/24823322');\n\n// 下载到 download/images 下，如果文件夹不存在将自动创建\nawait download(\n  'https://avatars.githubusercontent.com/u/24823322',\n  'download/images'\n);\n\n// 下载到 download/images 下，并将文件命名为 avatar.png\nawait download(\n  'https://avatars.githubusercontent.com/u/24823322',\n  'download/images/avatar.png'\n);\n\n/**\n * 下载到 download/images 下，并将文件命名为 my-avatar \n * 扩展名根据 MIME 类型判断生成\n * 当你确定要下载的文件类型，而又想设置文件名城时，可通过此方式实现\n */\nawait download(\n  'https://avatars.githubusercontent.com/u/24823322',\n  'download/images',\n  {\n    filename: 'my-avatar'\n  }\n);\n```\n\n## 多个文件下载\n\n[examples/multiple-downloads.ts](https://github.com/onlymisaky/download/blob/master/examples/multiple-downloads.ts)\n\n```ts\nconst ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nconst links = ids.map((id) =\u003e `https://avatars.githubusercontent.com/u/${id}`);\n\n// 所有文件会下载到 download/images/avatars\nawait download(\n  links,\n  'download/images/avatars'\n);\n\n// 下载链接数组与 output 目录数组一一相对应\n// 0.png 下载到 download/images/avatars/0/0.png\n// 1.png 下载到 download/images/avatars/1/1.png\nawait download(\n  links,\n  ids.map((id) =\u003e `download/images/avatars/${id}`),\n);\n\n// 通过函数创建下载目录\nawait download(\n  links,\n  (index, url) =\u003e `download/images/avatars/${index}-avatar.png`\n);\n```\n\n## 多个文件分批次下载\n\n[examples/multiple-batch-downloads.ts](https://github.com/onlymisaky/download/blob/master/examples/multiple-batch-downloads.ts)\n\n\n```ts\n// 开始下载回调\n// 该函数的返回值将会作为参数传给 onDownload \nfunction onStartDownload(ctx) {\n  return createBar(ctx.filename, ctx.size)\n}\n\n// 下载中回调\n// 第三个参数为 onStartDownload 的返回值，默认为 undefined\nfunction onDownload(chunk, ctx, progressBar) {\n  tickBar(customCtx as ProgressBar, chunk.length, ctx.downloaded)\n}\n\nconst links = [\n  `https://github.com/citra-emu/citra-web/releases/download/1.0/citra-setup-mac.dmg`,\n  `https://dl.dolphin-emu.org/builds/fd/c8/dolphin-master-5.0-15105-x64.7z`,\n  `https://dl.dolphin-emu.org/builds/eb/fa/dolphin-master-5.0-15105-universal.dmg`,\n  `https://dl.dolphin-emu.org/builds/e8/76/dolphin-master-5.0-15105.dmg`,\n  `https://dl.dolphin-emu.org/builds/10/d8/dolphin-master-5.0-15105.apk`\n];\n\n// 依次下载，错误的下载不会阻塞后续下载任务\nconst result = await download(links, 'download/emu', {\n  concurrent: 2, // 设置每次下载文件个数，默认全部同时下载\n  onStartDownload,\n  onDownload,\n});\n```\n![downloading](examples/downloading.png)\n\n## API\n\n###  download(url, output?, options?)\n\n#### url\n\ntype: `string` | `string[]`\n\n下载链接\n\n#### output\n\ntype: `string` | `string[]` | `(index: number, url: string) =\u003e string;`\n\ndefault: `''`\n\n可以是文件夹 `download/videos`，也可以是文件路径 `download/videos/1.mp4` 。\n\n当传入的 url 为数组时，output 数组，或 output 方法返回的路径与 url 下载的文件一一对应。\n\n当 output 具体到文件名称时： `1.mp4` ，即使所下载的文件不是视频文件，也会将扩展名设置为 `.mp4` ，所以如果你只是想设置文件名称，而又不清楚所下载的文件是何种类型的文件，请通过 `options.filename` 来设置。\n\n#### options\n\ntype: `object`\n\ndefault: `{}`\n\n通过 [axios](https://github.com/axios/axios) 创请求，所以 [AxiosRequestConfig](https://github.com/axios/axios#request-config) 的属性都可以传入，除此之外，还有一下这些属性：\n\n##### concurrent\n\ntype: `number`\n\ndefault: `url.length - 1`\n\n当传入的 url 为数组时，通过 concurrent 设置每次同时下载的数量，默认全部同时下载\n\n##### retryCount\n\ntype: `number`\n\ndefault: `3`\n\n##### threadCount\n\ntype: `number`\n\ndefault: `5`\n\n##### filename\n\ntype: `string`\n\n用于设置下载文件的文件名称，当你不确定文件类型，而又想设置文件名时，可以通过设置此字段实现，该字段再设置文件名过程中优先级最高。\n\n##### onStartDownload\n\ntype: `\u003cT\u003e(ctx: DownloadCbCtx) =\u003e T`\n\ndefault: `() =\u003e undefined`\n\n下载文件前回调，你可以通过调用该函数创建一个 `customCtx` 传递给 `onDownload` ，这在某些连续操作的场景下很有用。\n\n##### onDownload\n\ntype: `\u003cT\u003e(chunk: string | Buffer, ctx: DownloadCbCtx, customCtx: T) =\u003e void`\n\ndefault: `() =\u003e { }`\n\n下载过程中的回调，如果你对 `fs.ReadStream` 有所了解的话，你完全可以把他当作 `readStream.on('data')` 的回调来使用。\n\n##### DownloadCbCtx\n- outputPath: 文件全路径\n- filename: 文件完整名称，包含扩展名\n- size: 文件大小，这是一个内部封装的对象，你可以通过调用 `toString()` 方法来直接显示\n- downloaded: 已下载的大小, 单位 byte\n- response: 请求的完整响应 AxiosResponse\u003cfs.ReadStream\u003e\n- ~~stream: 正在写入的流 fs.WriteStream~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonlymisaky%2Fdownload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fonlymisaky%2Fdownload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonlymisaky%2Fdownload/lists"}