Un gestionnaire de téléchargement de fichiers simple et facile à utiliser pour les applications Electron. Conçu en réponse aux nombreux problèmes liés à electron-dl
et fournit une solution plus robuste et fiable pour le téléchargement de fichiers dans Electron.
Cas d'utilisation :
Télécharger des fichiers à partir d'une URL
Obtenez un identifiant associé au téléchargement pour le suivre
Afficher éventuellement une boîte de dialogue "Enregistrer sous"
Obtenez des mises à jour sur la progression du téléchargement
Pouvoir annuler/mettre en pause/reprendre les téléchargements
Prend en charge plusieurs téléchargements à la fois
Electron 26.0.0 ou version ultérieure est requis.
// Dans le processus principal// Ce n'est pas un exemple fonctionnel, juste une démonstration de l'APIimport { ElectronDownloadManager } depuis 'electron-dl-manager';const manager = new ElectronDownloadManager();// Démarrer un downloadconst id = wait manager.download( { fenêtre : navigateurWindowInstance, URL : 'https://exemple.com/file.zip', saveDialogOptions : {titre : 'Enregistrer le fichier', }, rappels : {onDownloadStarted : async ({ id, item, webContents }) => { // Faire quelque chose avec l'identifiant de téléchargement},onDownloadProgress : async (...) => {},onDownloadCompleted : async (...) = > {},onDownloadCancelled : async (...) => {},onDownloadInterrupted : async (...) => {},onError : (erreur, données) => {}, }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
Gestionnaire de téléchargement de fichiers électroniques
Installation
Commencer
API
Propriétés
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
Progression du téléchargement du formatage
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
Interface : DownloadParams
Interface : DownloadManagerCallbacks
Classe : ElectronDownloadManager
Classe : DownloadData
Classe simulée
FAQ
Remerciements
$ npm installer le gestionnaire d'électrons-dl
Vous souhaiterez utiliser electron-dl-manager
dans le processus principal de votre application Electron où vous gérerez les téléchargements de fichiers.
Dans cet exemple, nous utilisons des gestionnaires/invocateurs IPC pour communiquer entre les processus principal et de rendu, mais vous pouvez utiliser n'importe quelle stratégie IPC de votre choix.
// MainIpcHandlers.tsimport { ElectronDownloadManager } depuis 'electron-dl-manager';import { ipcMain } depuis 'electron';const manager = new ElectronDownloadManager();// Le moteur de rendu invoquerait ce gestionnaire pour démarrer un téléchargementipcMain.handle('download -file', async (événement, arguments) => { const {url} = arguments ; laissez downloadId const browserWindow = BrowserWindow.fromId (event.sender.id) // Vous *devez* appeler manager.download() avec wait ou // vous pourriez avoir un comportement inattendu downloadId = wait manager.download({window: browserWindow,url,// Si vous souhaitez télécharger sans enregistrer sous dialogsaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// Si vous souhaitez télécharger avec un enregistrement sous dialogsaveDialogOptions : { title : 'Save File',},callbacks : { // l'élément est une instance d'Electron.DownloadItem onDownloadStarted : async ({ id, item, wantedFilename }) => {// Renvoie l'identifiant de téléchargement au moteur de rendu avec // avec un autre databrowserWindow.webContents.invoke('download-started', { id, // Le nom du fichier que le fichier sera enregistré sous le nom de fichier : wantedFilename, // Obtenez la taille du fichier à télécharger en octets totalBytes : item.getTotalBytes(),}); }, onDownloadProgress : async ({ id, item, percentCompleted }) => {// Renvoie la progression du téléchargement au rendererbrowserWindow.webContents.invoke('download-progress', { id, percentCompleted, // Récupère le nombre d'octets reçus jusqu'à présent bytesReceived: item.getReceivedBytes(),}); }, onDownloadCompleted : async ({ id, item }) => {// Renvoie la fin du téléchargement au rendererbrowserWindow.webContents.invoke('download-completed', { id, // Obtenez le chemin d'accès au fichier téléchargé filePath : item.getSavePath(),}); }, onError : (err, data) => {// ... gérer les erreurs }} }); // Suspend le téléchargement manager.pauseDownload(downloadId);});
ElectronDownloadManager
Gère les téléchargements de fichiers dans une application Electron.
constructor()
constructeur (params : DownloadManagerConstructorParams)
interface DownloadManagerConstructorParams { /** * Si défini, déconnectera les messages de débogage internes. Utile pour * dépanner les téléchargements. Ne déconnecte pas la progression en raison de * sa fréquence. */ debugLogger ? : (message : chaîne) => void}
download()
Démarre un téléchargement de fichier. Renvoie l' id
du téléchargement.
download(params : DownloadParams) : Promesse<string>
DownloadParams
interface DownloadParams { /** * L'instance Electron.BrowserWindow */ fenêtre : Fenêtre du navigateur /** * L'URL à télécharger */ URL : chaîne /** * Les rappels à définir pour écouter les événements de téléchargement */ rappels : DownloadManagerCallbacks /** * Electron.DownloadURLOptions à transmettre à la méthode downloadURL * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions ? : Electron.DownloadURLOptions /** * Si défini, affichera une boîte de dialogue de sauvegarde lorsque l'utilisateur * télécharge un fichier. * * @see https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions ? : SaveDialogOptions /** * Le nom de fichier sous lequel enregistrer le fichier. S'il n'est pas défini, le nom de fichier * du serveur sera utilisé. * * S'applique uniquement si saveDialogOptions n'est pas défini. */ saveAsFilename?: chaîne /** * Le répertoire dans lequel enregistrer le fichier. Doit être un chemin absolu. * @default Le répertoire de téléchargements de l'utilisateur */ répertoire ? : chaîne /** * Si vrai, écrasera le fichier s'il existe déjà * @default false */ écraser ? : booléen}
DownloadManagerCallbacks
interface DownloadManagerCallbacks { /** * Lorsque le téléchargement a commencé. Lors de l'utilisation d'une boîte de dialogue "Enregistrer sous", * celle-ci sera appelée une fois que l'utilisateur aura sélectionné un emplacement. * * Ceci sera toujours appelé en premier avant la progression et les événements terminés. */ onDownloadStarted : (données : DownloadData) => void /** * Lorsqu'il y a une mise à jour de la progression d'un téléchargement. Remarque : Ceci * peut être entièrement ignoré dans certains cas, où le téléchargement * se termine immédiatement. Dans ce cas, onDownloadCompleted * sera appelé à la place. */ onDownloadProgress : (données : DownloadData) => void /** * Une fois le téléchargement terminé */ onDownloadCompleted : (données : DownloadData) => void /** * Lorsque le téléchargement a été annulé. Également appelé si l'utilisateur annule * dans la boîte de dialogue Enregistrer sous. */ onDownloadCancelled : (données : DownloadData) => void /** * Lorsque le téléchargement a été interrompu. Cela peut être dû à une mauvaise * connexion, à une panne du serveur, etc. */ onDownloadInterrupted : (données : DownloadData) => void /** * Lorsqu'une erreur a été rencontrée. * Remarque : La signature est (erreur, <peut-être quelques données>). */ onError : (erreur : erreur, données ? : DownloadData) => void}
cancelDownload()
Annule un téléchargement.
CancelDownload(id:string): void
pauseDownload()
Suspend un téléchargement.
pauseDownload (id : string) : void
resumeDownload()
Reprend un téléchargement.
reprendreDownload (id : chaîne) : vide
getActiveDownloadCount()
Renvoie le nombre de téléchargements actifs.
getActiveDownloadCount() : nombre
getDownloadData()
Renvoie les données de téléchargement pour un téléchargement.
getDownloadData (id : chaîne) : DownloadData
DownloadData
Données renvoyées dans les rappels pour un téléchargement.
classe DownloadData { /** * Identifiant généré pour le téléchargement */ identifiant : chaîne /** * L'Electron.DownloadItem. Utilisez-le pour récupérer le nom du fichier, le chemin, etc. * @see https://www.electronjs.org/docs/latest/api/download-item */ élément : Télécharger l'élément /** * The Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ Contenu Web : Contenu Web /** * The Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ événement : événement /** * Le nom du fichier en cours d'enregistrement sur l'ordinateur de l'utilisateur. * Recommandé par rapport à Item.getFilename() car il peut être inexact lors de l'utilisation de la boîte de dialogue Enregistrer sous. */ Nom de fichier résolu : chaîne /** * Si vrai, le téléchargement a été annulé à partir de la boîte de dialogue Enregistrer sous. Cet indicateur * sera également vrai si le téléchargement a été annulé par l'application lors de * l'utilisation de la boîte de dialogue Enregistrer sous. */ CancelledFromSaveAsDialog? : booléen /** * Le pourcentage de téléchargement terminé */ pourcentage terminé : nombre /** * Le taux de téléchargement en octets par seconde. */ downloadRateBytesPerSecond : nombre /** * Le temps restant estimé en secondes. */ estimateTimeRemainingSeconds : nombre /** * Si le téléchargement a été interrompu, l'état dans lequel il a été interrompu */ interrompuVia?: 'en cours' | 'complété'}
Vous pouvez utiliser les bibliothèques bytes
et dayjs
pour formater la progression du téléchargement.
$ npm installer les octets dayjs $ npm install @types/bytes --save-dev
importer des octets depuis 'bytes' importer dayjs depuis 'dayjs' importer relativeTime depuis 'dayjs/plugin/relativeTime'; importer la durée depuis 'dayjs/plugin/duration'; dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData = manager.getDownloadData(id); // ou DataItem des rappels// Renverra quelque chose comme 1,2 Mo/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s'// Renverra quelque chose comme "dans quelques secondes" const formattedEstimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, 'secondes').humaniser(vrai)
isDownloadInProgress()
Renvoie vrai si le téléchargement est en cours.
isDownloadInProgress() : booléen
isDownloadPaused()
Renvoie vrai si le téléchargement est suspendu.
isDownloadPaused() : booléen
isDownloadResumable()
Renvoie vrai si le téléchargement peut être repris.
isDownloadResumable() : booléen
isDownloadCancelled()
Renvoie vrai si le téléchargement est annulé.
isDownloadCancelled() : booléen
isDownloadInterrupted()
Renvoie vrai si le téléchargement est interrompu.
isDownloadInterrupted() : booléen
isDownloadCompleted()
Renvoie vrai si le téléchargement est terminé.
isDownloadCompleted() : booléen
Si vous devez simuler ElectronDownloadManager
dans vos tests, vous pouvez utiliser la classe ElectronDownloadManagerMock
.
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
n'est pas appelé. Electron DownloadItem
ne fournit pas de moyen explicite de capturer les erreurs pour les téléchargements en général :
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(Il n'a que les événements on('updated')
et on('done')
, que cette bibliothèque utilise pour définir les gestionnaires de rappel.)
Ce qu'il fait pour les URL non valides, cela déclenchera le rappel onDownloadCancelled()
.
const id = wait manager.download({ fenêtre : fenêtre principale, URL : 'https://alkjsdflksjdflk.com/file.zip', rappels : {onDownloadCancelled : async (...) => { // Téléchargement invalide ; ce rappel sera appelé}, }});
Une meilleure façon de gérer cela est de vérifier vous-même si l’URL existe avant le téléchargement. Je n'ai pas trouvé de bibliothèque que je pensais fiable à inclure dans ce package, il est donc préférable que vous trouviez une bibliothèque qui fonctionne pour vous :
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT suggère également le code suivant (non testé) :
fonction asynchrone urlExists(url: string): Promise<boolean> { essayez {const réponse = wait fetch(url, { méthode : 'HEAD' });return réponse.ok; } catch (erreur) {return false; }}const existe = wait urlExists('https://example.com/file.jpg');
Ce code utilise de petites portions d' electron-dl
et est noté dans le code où il est utilisé.
electron-dl
est sous licence MIT et est maintenu par Sindre Sorhus [email protected] (https://sindresorhus.com).