Electron アプリケーション用のシンプルで使いやすいファイル ダウンロード マネージャー。 electron-dl
に関する多くの問題に対応して設計されており、Electron でファイルをダウンロードするためのより堅牢で信頼性の高いソリューションを提供します。
使用例:
URLからファイルをダウンロードする
ダウンロードに関連付けられた ID を取得して追跡します
オプションで「名前を付けて保存」ダイアログを表示します
ダウンロードの進行状況の最新情報を取得する
ダウンロードのキャンセル/一時停止/再開が可能
一度に複数のダウンロードをサポート
Electron 26.0.0 以降が必要です。
// メインプロセス内 // 動作する例ではなく、'electron-dl-manager' からの APIimport { ElectronDownloadManager } のデモです;const manager = new ElectronDownloadManager();// ダウンロードを開始const id = await manager.download( { ウィンドウ: ブラウザウィンドウインスタンス、 URL: 'https://example.com/file.zip', saveDialogOptions: {title: 'ファイルを保存', }、 callbacks: {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);
電子ファイル ダウンロード マネージャー
インストール
はじめる
API
プロパティ
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
ダウンロードのフォーマットの進行状況
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
インターフェース: DownloadParams
インターフェース: DownloadManagerCallbacks
クラス: ElectronDownloadManager
クラス: DownloadData
模擬授業
よくある質問
謝辞
$ npm install electric-dl-manager
ファイルのダウンロードを処理する Electron アプリケーションのメイン プロセスで、 electron-dl-manager
使用するとよいでしょう。
この例では、IPC ハンドラー/呼び出し側を使用してメイン プロセスとレンダラー プロセスの間で通信しますが、任意の IPC 戦略を使用できます。
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// レンダラーはこのハンドラーを呼び出して downloadipcMain.handle('download -file', async (event, args) => { const { URL } = 引数; ダウンロードIDを許可します const browserWindow = BrowserWindow.fromId(event.sender.id) // await またはを指定して manager.download() を呼び出す必要があります。 // 予期しない動作が発生する可能性があります downloadId = await 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,solvedFilename }) => {// 他の databrowserWindow.webContents.invoke('download-started', { id, // ファイル名とともに) ダウンロード ID をレンダラに送り返します//ファイルは filename:solvedFilename として保存されます。 // ダウンロードされるファイル サイズをバイト単位で取得します。 totalBytes: item.getTotalBytes(),}); onDownloadProgress: async ({ id, item,percentCompleted }) => {// ダウンロードの進行状況を rendererbrowserWindow.webContents.invoke('download-progress', { id,percentCompleted, // 受信したバイト数を取得します) far 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
を返します。
download(params: DownloadParams): Promise<string>
DownloadParams
インターフェイス DownloadParams { /** * Electron.BrowserWindow インスタンス */ ウィンドウ: ブラウザウィンドウ /** * ダウンロードする URL */ URL: 文字列 /** * ダウンロード イベントをリッスンするために定義するコールバック */ コールバック: DownloadManagerCallbacks /** * downloadURL メソッドに渡す Electron.DownloadURLOptions * * @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 /** * ファイルを保存するファイル名。定義されていない場合は、サーバーからのファイル名 * が使用されます。 * * saveDialogOptions が定義されていない場合にのみ適用されます。 */ ファイル名として保存?: 文字列 /** * ファイルを保存するディレクトリ。絶対パスである必要があります。 * @default ユーザーのダウンロード ディレクトリ */ ディレクトリ?: 文字列 /** * true の場合、ファイルが既に存在する場合はファイルを上書きします * @default false */ 上書きしますか?: ブール値}
DownloadManagerCallbacks
インターフェイス DownloadManagerCallbacks { /** * ダウンロードが開始されたとき。 「名前を付けて保存」ダイアログを使用する場合、 * これはユーザーが場所を選択した後に呼び出されます。 * * これは常に進行状況イベントと完了イベントの前に最初に呼び出されます。 */ onDownloadStarted: (データ: DownloadData) => void /** * ダウンロードの進行状況の更新がある場合。注: これは * 場合によっては完全にスキップされ、ダウンロードは * すぐに完了します。その場合、代わりに onDownloadCompleted * が呼び出されます。 */ onDownloadProgress: (データ: DownloadData) => void /** * ダウンロードが完了したら */ onDownloadCompleted: (データ: DownloadData) => void /** * ダウンロードがキャンセルされた場合。ユーザーが [名前を付けて保存] ダイアログから * をキャンセルした場合にも呼び出されます。 */ onDownloadCancelled: (データ: DownloadData) => void /** * ダウンロードが中断された場合。これは * 接続不良、サーバーのダウンなどが原因である可能性があります。 */ onDownloadInterrupted: (データ: DownloadData) => void /** * エラーが発生した場合。 * 注: 署名は (エラー、<おそらく何らかのデータ>) です。 */ onError: (エラー: エラー、データ?: ダウンロードデータ) => void}
cancelDownload()
ダウンロードをキャンセルします。
cancelDownload(id: string): void
pauseDownload()
ダウンロードを一時停止します。
一時停止ダウンロード(id: 文字列): void
resumeDownload()
ダウンロードを再開します。
resumeDownload(id: string): void
getActiveDownloadCount()
アクティブなダウンロードの数を返します。
getActiveDownloadCount(): 数値
getDownloadData()
ダウンロードのダウンロード データを返します。
getDownloadData(id: string): ダウンロードデータ
DownloadData
ダウンロードのコールバックで返されるデータ。
クラス DownloadData { /** * ダウンロード用に生成された ID */ ID: 文字列 /** * Electron.DownloadItem。これを使用して、ファイル名、パスなどを取得します。 * @see https://www.electronjs.org/docs/latest/api/download-item */ アイテム: ダウンロードアイテム /** * Electron.WebContents * @https://www.electronjs.org/docs/latest/api/web-contents を参照 */ ウェブコンテンツ: ウェブコンテンツ /** * Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ イベント: イベント /** * ユーザーのコンピュータに保存されているファイルの名前。 * 名前を付けて保存ダイアログを使用する場合は不正確になる可能性があるため、Item.getFilename() よりも推奨されます。 */ 解決済みファイル名: 文字列 /** * true の場合、ダウンロードは名前を付けて保存ダイアログからキャンセルされました。このフラグは、 * 名前を付けて保存ダイアログを使用したときに * アプリケーションによってダウンロードがキャンセルされた場合にも true になります。 */ cancelFromSaveAsDialog?: ブール値 /** * 完了したダウンロードの割合 */ 完了パーセント: 数値 /** * ダウンロード速度 (バイト/秒)。 */ ダウンロードレートバイト/秒: 数値 /** * 推定残り時間 (秒単位)。 */ 推定残り時間秒: 数値 /** * ダウンロードが中断された場合は、中断された状態から */ 中断経由?: '進行中' | '完了'}
ライブラリの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 = マネージャー.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 = マネージャーを待ちます.ダウンロード({ ウィンドウ: メインウィンドウ、 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> { try {constresponse = await fetch(url, {method: 'HEAD' });return response.ok; キャッチ (エラー) {戻り値 false; }}const存在 = await urlExists('https://example.com/file.jpg');
このコードは、 electron-dl
の小さな部分を使用しており、それが使用されているコード内に記載されています。
electron-dl
MIT ライセンスに基づいてライセンス供与されており、Sindre Sorhus [email protected] (https://sindresorhus.com) によって管理されています。