Ein einfacher und benutzerfreundlicher Datei-Download-Manager für Electron-Anwendungen. Entwickelt als Reaktion auf die vielen Probleme rund um electron-dl
und bietet eine robustere und zuverlässigere Lösung zum Herunterladen von Dateien in Electron.
Anwendungsfälle:
Laden Sie Dateien von einer URL herunter
Rufen Sie eine mit dem Download verknüpfte ID ab, um ihn zu verfolgen
Zeigen Sie optional ein Dialogfeld „Speichern unter“ an
Erhalten Sie Fortschrittsaktualisierungen beim Download
Sie können Downloads abbrechen/anhalten/fortsetzen
Unterstützt mehrere Downloads gleichzeitig
Electron 26.0.0 oder höher ist erforderlich.
// Im Hauptprozess// Kein funktionierendes Beispiel, nur eine Demonstration des APIimport { ElectronDownloadManager } von 'electron-dl-manager';const manager = new ElectronDownloadManager();// Starten Sie einen Downloadconst id = waiting manager.download( { Fenster: browserWindowInstance, URL: 'https://example.com/file.zip', saveDialogOptions: {title: 'Datei speichern', }, Rückrufe: {onDownloadStarted: async ({ id, item, webContents }) => { // Etwas mit der Download-ID tun},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: async (...) => {},onDownloadInterrupted: async (...) => {},onError: (err, data) => {}, }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
Electron-Datei-Download-Manager
Installation
Erste Schritte
API
Eigenschaften
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
Formatieren des Download-Fortschritts
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
Schnittstelle: DownloadParams
Schnittstelle: DownloadManagerCallbacks
Klasse: ElectronDownloadManager
Klasse: DownloadData
Scheinunterricht
FAQ
Danksagungen
$ npm install electron-dl-manager
Sie sollten electron-dl-manager
im Hauptprozess Ihrer Electron-Anwendung verwenden, wo Sie die Dateidownloads verwalten.
In diesem Beispiel verwenden wir IPC-Handler/Aufrufer, um zwischen den Haupt- und Renderer-Prozessen zu kommunizieren, Sie können jedoch jede gewünschte IPC-Strategie verwenden.
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// Renderer würde diesen Handler aufrufen, um einen Download zu startenipcMain.handle('download -file', async (event, args) => { const { url } = args; lass downloadId const browserWindow = BrowserWindow.fromId(event.sender.id) // Sie *müssen* manager.download() mit „await or“ aufrufen // Möglicherweise kommt es zu unerwartetem Verhalten downloadId = waiting manager.download({window: browserWindow,url,// Wenn Sie ohne Dialog „Speichern unter“ herunterladen möchtensaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// Wenn Sie Ich möchte mit „Speichern unter“ herunterladen. dialogsaveDialogOptions: { title: 'Save File',},callbacks: { // item ist eine Instanz von Electron.DownloadItem onDownloadStarted: async ({ id, item, aufgelöster Dateiname }) => {// Senden Sie die Download-ID zusammen mit einigen anderen Daten an den Renderer zurück. webContents.invoke('download-started', { id, // Der Dateiname, den die Datei haben wird gespeichert als Dateiname: gelöster Dateiname, // Die herunterzuladende Dateigröße in Bytes abrufen totalBytes: item.getTotalBytes(),} }, onDownloadProgress: async ({ id, item, percentCompleted }) => {// Sende den Download-Fortschritt zurück an rendererbrowserWindow.webContents.invoke('download-progress', { id, percentCompleted, // Anzahl der bisher empfangenen Bytes abrufen bytesReceived: item. getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// Senden Sie den Download-Abschluss zurück zum rendererbrowserWindow.webContents.invoke('download-completed', { id, // Den Pfad zur heruntergeladenen Datei abrufen filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... alle Fehler behandeln }} }); // Den Download anhalten manager.pauseDownload(downloadId);});
ElectronDownloadManager
Verwaltet Dateidownloads in einer Electron-Anwendung.
constructor()
Konstruktor (Parameter: DownloadManagerConstructorParams)
Schnittstelle DownloadManagerConstructorParams { /** * Wenn definiert, werden interne Debug-Meldungen abgemeldet. Nützlich für * Fehlerbehebung bei Downloads. Aufgrund * der Häufigkeit erfolgt keine Abmeldung. */ debugLogger?: (message: string) => void}
download()
Startet einen Dateidownload. Gibt die id
des Downloads zurück.
download(params: DownloadParams): Promise<string>
DownloadParams
Schnittstelle DownloadParams { /** * Die Electron.BrowserWindow-Instanz */ Fenster: BrowserWindow /** * Die URL zum Herunterladen */ URL: Zeichenfolge /** * Die zu definierenden Rückrufe, um auf Download-Ereignisse zu warten */ Rückrufe: DownloadManagerCallbacks /** * Electron.DownloadURLOptions zur Übergabe an die downloadURL-Methode * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions?: Electron.DownloadURLOptions /** * Falls definiert, wird ein Speicherdialog angezeigt, wenn der Benutzer * eine Datei herunterlädt. * * @see https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions?: SaveDialogOptions /** * Der Dateiname, unter dem die Datei gespeichert werden soll. Wenn nicht definiert, wird der Dateiname * vom Server verwendet. * * Gilt nur, wenn saveDialogOptions nicht definiert ist. */ saveAsFilename?: string /** * Das Verzeichnis, in dem die Datei gespeichert werden soll. Muss ein absoluter Pfad sein. * @default Das Download-Verzeichnis des Benutzers */ Verzeichnis?: Zeichenfolge /** * Wenn wahr, wird die Datei überschrieben, wenn sie bereits existiert * @default false */ überschreiben?: boolean}
DownloadManagerCallbacks
Schnittstelle DownloadManagerCallbacks { /** * Wenn der Download gestartet wurde. Bei Verwendung eines „Speichern unter“-Dialogs * wird dieser aufgerufen, nachdem der Benutzer einen Speicherort ausgewählt hat. * * Dies wird immer zuerst vor den Fortschritts- und abgeschlossenen Ereignissen aufgerufen. */ onDownloadStarted: (Daten: DownloadData) => void /** * Wenn es bei einem Download eine Fortschrittsaktualisierung gibt. Hinweis: Dieser * kann in einigen Fällen vollständig übersprungen werden, wenn der Download * sofort abgeschlossen wird. In diesem Fall wird stattdessen onDownloadCompleted * aufgerufen. */ onDownloadProgress: (Daten: DownloadData) => void /** * Wenn der Download abgeschlossen ist */ onDownloadCompleted: (Daten: DownloadData) => void /** * Wenn der Download abgebrochen wurde. Wird auch aufgerufen, wenn der Benutzer den Dialog „Speichern unter“ abbricht. */ onDownloadCancelled: (Daten: DownloadData) => void /** * Wenn der Download unterbrochen wurde. Dies kann an einer schlechten * Verbindung, einem Serverausfall usw. liegen. */ onDownloadInterrupted: (Daten: DownloadData) => void /** * Wenn ein Fehler aufgetreten ist. * Hinweis: Die Signatur lautet (Fehler, <vielleicht einige Daten>). */ onError: (Fehler: Fehler, Daten?: DownloadData) => void}
cancelDownload()
Bricht einen Download ab.
cancelDownload(id: string): void
pauseDownload()
Pausiert einen Download.
pauseDownload(id: string): void
resumeDownload()
Setzt einen Download fort.
resumeDownload(id: string): void
getActiveDownloadCount()
Gibt die Anzahl der aktiven Downloads zurück.
getActiveDownloadCount(): Zahl
getDownloadData()
Gibt die Download-Daten für einen Download zurück.
getDownloadData(id: string): DownloadData
DownloadData
In den Rückrufen für einen Download zurückgegebene Daten.
Klasse DownloadData { /** * Generierte ID für den Download */ ID: Zeichenfolge /** * Das Electron.DownloadItem. Verwenden Sie dies, um den Dateinamen, den Pfad usw. abzurufen. * @siehe https://www.electronjs.org/docs/latest/api/download-item */ Artikel: DownloadItem /** * The Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ webContents: WebContents /** * The Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ Ereignis: Ereignis /** * Der Name der Datei, die auf dem Computer des Benutzers gespeichert wird. * Empfohlen gegenüber Item.getFilename(), da es bei Verwendung des Dialogfelds „Speichern unter“ möglicherweise ungenau ist. */ aufgelöster Dateiname: Zeichenfolge /** * Wenn „true“, wurde der Download über das Dialogfeld „Speichern unter“ abgebrochen. Dieses Flag * ist auch wahr, wenn der Download von der Anwendung abgebrochen wurde, * wenn das Dialogfeld „Speichern unter“ verwendet wurde. */ cancelledFromSaveAsDialog?: boolean /** * Der Prozentsatz des abgeschlossenen Downloads */ „percentCompleted“: Zahl /** * Die Download-Rate in Bytes pro Sekunde. */ downloadRateBytesPerSecond: Zahl /** * Die geschätzte verbleibende Zeit in Sekunden. */ geschätzteZeitRemainingSeconds: Zahl /** * Wenn der Download unterbrochen wurde, der Status, in dem er unterbrochen wurde */ interruptedVia?: 'in Bearbeitung' | 'vollendet'}
Sie können die Bibliotheken bytes
und dayjs
verwenden, um den Download-Fortschritt zu formatieren.
$ npm install bytes dayjs $ npm install @types/bytes --save-dev
Bytes aus 'bytes' importieren, Dayjs aus 'dayjs' importieren, relativeTime aus 'dayjs/plugin/relativeTime' importieren; Dauer aus 'dayjs/plugin/duration' importieren;dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData = manager.getDownloadData(id); // oder DataItem aus den Rückrufen// Gibt etwa 1,2 MB/sconst zurück. formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s'// Gibt etwa „in ein paar Sekunden“const zurück formattedtimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, 'seconds').humanize(true)
isDownloadInProgress()
Gibt true zurück, wenn der Download ausgeführt wird.
isDownloadInProgress(): boolean
isDownloadPaused()
Gibt true zurück, wenn der Download angehalten ist.
isDownloadPaused(): boolean
isDownloadResumable()
Gibt true zurück, wenn der Download fortgesetzt werden kann.
isDownloadResumable(): boolean
isDownloadCancelled()
Gibt true zurück, wenn der Download abgebrochen wird.
isDownloadCancelled(): boolean
isDownloadInterrupted()
Gibt true zurück, wenn der Download unterbrochen wird.
isDownloadInterrupted(): boolean
isDownloadCompleted()
Gibt true zurück, wenn der Download abgeschlossen ist.
isDownloadCompleted(): boolean
Wenn Sie ElectronDownloadManager
in Ihren Tests nachahmen müssen, können Sie die ElectronDownloadManagerMock
-Klasse verwenden.
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
wird nicht aufgerufen. Electron DownloadItem
bietet keine explizite Möglichkeit, Fehler für Downloads im Allgemeinen zu erfassen:
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(Es gibt nur die Ereignisse on('updated')
und on('done')
, die diese Bibliothek zum Definieren der Callback-Handler verwendet.)
Bei ungültigen URLs löst es den Rückruf onDownloadCancelled()
aus.
const id = waiting manager.download({ Fenster: mainWindow, URL: 'https://alkjsdflksjdflk.com/file.zip', Rückrufe: {onDownloadCancelled: async (...) => { // Ungültiger Download; dieser Rückruf wird aufgerufen}, }});
Eine bessere Möglichkeit, damit umzugehen, besteht darin, vor dem Download selbst zu prüfen, ob die URL existiert. Ich konnte keine Bibliothek finden, die meiner Meinung nach zuverlässig in dieses Paket integriert werden konnte. Suchen Sie sich also am besten eine Bibliothek aus, die für Sie geeignet ist:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT schlägt außerdem den folgenden Code vor (ungetestet):
asynchrone Funktion urlExists(url: string): Promise<boolean> { try {const Response =wait fetch(url, { method: 'HEAD' });return Response.ok; } Catch (Fehler) {return false; }}const existiert = waiting urlExists('https://example.com/file.jpg');
Dieser Code verwendet kleine Teile von electron-dl
und ist im Code vermerkt, wo er verwendet wird.
electron-dl
ist unter der MIT-Lizenz lizenziert und wird von Sindre Sorhus [email protected] (https://sindresorhus.com) verwaltet.