一个简单易用的 Electron 应用程序文件下载管理器。旨在解决有关electron-dl
许多问题,并为在 Electron 中下载文件提供更强大、更可靠的解决方案。
使用案例:
从 URL 下载文件
获取与下载关联的 ID 以跟踪它
可以选择显示“另存为”对话框
获取下载进度更新
能够取消/暂停/恢复下载
支持一次多个下载
需要 Electron 26.0.0 或更高版本。
// 在主进程中 // 不是一个工作示例,只是 API 的演示 import { ElectronDownloadManager } from ' electron-dl-manager'; const manager = new ElectronDownloadManager();// 开始下载 const id = wait manager.download( { 窗口:浏览器窗口实例, url: 'https://example.com/file.zip', saveDialogOptions: {title: '保存文件', }, 回调: {onDownloadStarted: async ({ id, item, webContents }) => { // 使用下载 id 执行某些操作},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: async (...) => {},onDownloadInterrupted: async (...) => {},onError: (err,数据)=> {}, }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
电子文件下载管理器
安装
入门
应用程序编程接口
特性
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
格式化下载进度
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
接口: DownloadParams
接口: DownloadManagerCallbacks
类: ElectronDownloadManager
类: DownloadData
模拟类
常问问题
致谢
$ npm 安装电子-dl-管理器
您将需要在 Electron 应用程序的主进程中使用electron-dl-manager
,您将在其中处理文件下载。
在此示例中,我们使用 IPC 处理程序/调用程序在主进程和渲染进程之间进行通信,但您可以使用任何您想要的 IPC 策略。
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// 渲染器将调用此处理程序来启动下载ipcMain.handle('download -file', async (事件, args) => { const { url } = 参数; 让downloadId const browserWindow = BrowserWindow.fromId(event.sender.id) // 你*必须*使用await或调用manager.download() // 你可能会得到意想不到的行为 downloadId = wait manager.download({window: browserWindow,url,// 如果您想下载而不另存为dialogsaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// 如果您想要使用另存为对话框进行下载 saveDialogOptions: { title: 'Save File',},callbacks: { // item 是 Electron.DownloadItem 的实例 onDownloadStarted: async ({ id, item,resolvedFilename }) => {// 将下载 id 与其他一些数据一起发送回渲染器 // 浏览器Window.webContents.invoke('download-started', { id, // 文件的文件名save as filename:resolvedFilename, // 获取要下载的文件大小(以字节为单位)totalBytes: item.getTotalBytes(),}); }, onDownloadProgress: async ({ id, item,%Completed }) => {// 将下载进度发送回 rendererbrowserWindow.webContents.invoke('download-progress', { id,percentCompleted, // 获取到目前为止接收到的字节数 bytesReceived: item. getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// 将下载完成发送回rendererbrowserWindow.webContents.invoke('download-completed', { id, // 获取已下载文件的路径 filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... 处理任何错误 }} }); // 暂停下载 manager.pauseDownload(downloadId);});
ElectronDownloadManager
管理 Electron 应用程序中的文件下载。
constructor()
构造函数(参数:DownloadManagerConstructorParams)
接口 DownloadManagerConstructorParams { /** * 如果定义,将注销内部调试消息。对于 * 排除下载故障很有用。由于 * 的频繁程度,不会注销进度。 */ debugLogger?:(消息:字符串)=> void}
download()
开始文件下载。返回下载的id
。
下载(参数:DownloadParams):Promise<string>
DownloadParams
接口下载参数{ /** * Electron.BrowserWindow 实例 */ 窗口:浏览器窗口 /** * 下载地址 */ 网址:字符串 /** * 定义监听下载事件的回调 */ 回调:DownloadManagerCallbacks /** * Electron.DownloadURLOptions 传递给 downloadURL 方法 * * @see https://www. Electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions?: Electron.DownloadURLOptions /** * 如果定义,当用户 * 下载文件时将显示一个保存对话框。 * * @参见https://www. Electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions?: 保存对话框选项 /** * 文件保存的文件名。如果未定义,将使用服务器中的文件名*。 * * 仅在未定义 saveDialogOptions 时适用。 */ saveAsFilename?: 字符串 /** * 保存文件的目录。必须是绝对路径。 * @default 用户的下载目录 */ 目录?:字符串 /** * 如果为 true,则覆盖文件(如果已存在) * @default false */ 覆盖?:布尔值}
DownloadManagerCallbacks
接口 DownloadManagerCallbacks { /** * 当下载开始时。当使用“另存为”对话框时, * 这将在用户选择位置后调用。 * * 这将始终在进度和已完成事件之前首先调用。 */ onDownloadStarted: (数据: DownloadData) => void /** * 当下载有进度更新时。注意:在某些情况下,可能会完全跳过此 *,下载会立即完成。在这种情况下,将调用 onDownloadCompleted * 。 */ onDownloadProgress: (数据: DownloadData) => void /** * 当下载完成时 */ onDownloadCompleted: (数据: DownloadData) => void /** * 当下载被取消时。如果用户从另存为对话框中取消*,也会调用。 */ onDownloadCancelled: (数据: DownloadData) => void /** * 当下载被中断时。这可能是由于连接不良、服务器宕机等造成的。*/ onDownloadInterrupted: (数据: DownloadData) => void /** * 当遇到错误时。 * 注意:签名是(错误,<可能是一些数据>)。 */ onError: (错误:错误,数据?:DownloadData) => void}
cancelDownload()
取消下载。
取消下载(id:字符串):无效
pauseDownload()
暂停下载。
暂停下载(id:字符串):无效
resumeDownload()
恢复下载。
恢复下载(id:字符串):无效
getActiveDownloadCount()
返回活动下载的数量。
getActiveDownloadCount():数量
getDownloadData()
返回下载的下载数据。
getDownloadData(id: string): 下载数据
DownloadData
下载回调中返回的数据。
类下载数据{ /** * 生成下载ID */ id: 字符串 /** * Electron.DownloadItem。使用它来获取文件名、路径等。 * @see https://www.electronjs.org/docs/latest/api/download-item */ 项目: 下载项目 /** * Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ 网页内容:网页内容 /** * Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ 事件: 事件 /** * 正在保存到用户计算机的文件的名称。 * 推荐使用 Item.getFilename(),因为使用“另存为”对话框时它可能不准确。 */ 已解析文件名:字符串 /** * 如果为 true,则从另存为对话框中取消下载。如果使用“另存为”对话框时应用程序取消了下载,则该标志也将为 true。 */ cancelledFromSaveAsDialog?: 布尔值 /** * 已完成下载的百分比 */ 完成百分比:数量 /** * 下载速率(以字节每秒为单位)。 */ downloadRateBytesPerSecond:数字 /** * 估计剩余时间(以秒为单位)。 */ 估计时间剩余秒数:数字 /** * 如果下载被中断,则中断时的状态 */ InterruptedVia?: '进行中' | '完全的'}
您可以使用bytes
和dayjs
库来格式化下载进度。
$ npm 安装字节 dayjs $ npm install @types/bytes --save-dev
从'bytes'导入字节从'dayjs'导入dayjs从'dayjs/plugin/relativeTime'导入相对时间;从'dayjs/plugin/duration'导入持续时间;dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData = manager.getDownloadData(id); // 或回调中的 DataItem // 将返回类似 1.2 MB/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s' // 将返回类似“几秒钟内”const 的内容formattedEstimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, '秒').人性化(true)
isDownloadInProgress()
如果下载正在进行,则返回 true。
isDownloadInProgress(): 布尔值
isDownloadPaused()
如果下载暂停则返回 true。
isDownloadPaused(): 布尔值
isDownloadResumable()
如果下载可恢复,则返回 true。
isDownloadResumable(): 布尔值
isDownloadCancelled()
如果下载被取消,则返回 true。
isDownloadCancelled(): 布尔值
isDownloadInterrupted()
如果下载中断则返回 true。
isDownloadInterrupted(): 布尔值
isDownloadCompleted()
如果下载完成则返回true。
isDownloadCompleted(): 布尔值
如果您需要在测试中模拟ElectronDownloadManager
,可以使用ElectronDownloadManagerMock
类。
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
没有被调用。 Electron DownloadItem
通常不提供捕获下载错误的明确方法:
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(它只有on('updated')
和on('done')
事件,该库使用这些事件来定义回调处理程序。)
它对无效 URL 的作用是触发onDownloadCancelled()
回调。
const id = 等待管理器.download({ 窗口:主窗口, url: 'https://alkjsdflksjdflk.com/file.zip', callbacks: {onDownloadCancelled: async (...) => { // 无效下载;这个回调将被调用}, }});
处理此问题的更好方法是在下载之前自行检查 URL 是否存在。我找不到一个我认为可靠的库可以包含在这个包中,所以最好找到一个适合您的库:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT 还建议使用以下代码(未经测试):
异步函数 urlExists(url: string): Promise<boolean> { 尝试 {const response = wait fetch(url, { method: 'HEAD' });return response.ok; } catch (错误) {返回 false; }}const 存在 = 等待 urlExists('https://example.com/file.jpg');
该代码使用了electron-dl
中的一小部分,并在使用它的代码中进行了注释。
electron-dl
根据 MIT 许可证获得许可,并由 Sindre Sorhus [email protected] (https://sindresorhus.com) 维护。