一個簡單易用的 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, data) => {}, }});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 }) => {// Send下載id 與其他一些資料一起回到渲染器browserWindow.webContents.invoke('download-started', { id, // 檔案將儲存為的檔案名稱filename:resolvedFilename, // 取得檔案大小以位元組為單位下載totalBytes: item.getTotalBytes(),}); }, onDownloadProgress: async ({ id, item,percentCompleted }) => {// 將下載進度傳回rendererbrowserWindow.webContents.invoke('download- Progress'rendererbrowserWindow.webContents.invoke('download- Progress', { idress', { PercentCompleted, // 取得到目前為止接收到的位元組數bytesReceived: item.getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// 發送下載完成返回到rendererbrowserWindow.webContentsserWindow.webContentsserWindow. .invoke('download-completed', { id, // 取得已下載檔案的路徑filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... 處理任何錯誤 }} }); // 暫停下載 manager.pauseDownload(downloadId);});
ElectronDownloadManager
管理 Electron 應用程式中的檔案下載。
constructor()
建構子(參數:DownloadManagerConstructorParams)
介面 DownloadManagerConstructorParams { /** * 如果定義,將註銷內部偵錯訊息。對於 * 排除下載故障很有用。由於 * 的頻繁程度,不會註銷進度。 */ debugLogger?
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。使用它來取得檔案名稱、路徑等。 項目: 下載項目 /** * 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, '秒'). humanize(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) 維護。