Un administrador de descarga de archivos simple y fácil de usar para aplicaciones Electron. Diseñado en respuesta a los numerosos problemas relacionados con electron-dl
y proporciona una solución más sólida y confiable para descargar archivos en Electron.
Casos de uso:
Descargar archivos desde una URL
Obtenga una identificación asociada con la descarga para rastrearla
Opcionalmente, muestra un cuadro de diálogo "Guardar como".
Obtenga actualizaciones de progreso en la descarga
Poder cancelar/pausar/reanudar descargas
Admite múltiples descargas a la vez
Se requiere Electron 26.0.0 o posterior.
// En el proceso principal// No es un ejemplo funcional, solo una demostración de APIimport { ElectronDownloadManager } de 'electron-dl-manager';const manager = new ElectronDownloadManager();// Iniciar una descargaconst id = await manager.download( { ventana: browserWindowInstance, URL: 'https://ejemplo.com/archivo.zip', saveDialogOptions: {título: 'Guardar archivo', }, devoluciones de llamada: {onDownloadStarted: async ({ id, item, webContents }) => { // Haz algo con el id de descarga},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: async (...) => {},onDownloadInterrupted: async (...) => {},onError: (err, datos) => {}, }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
Administrador de descarga de archivos electrónicos
Instalación
Empezando
API
Propiedades
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
Progreso de descarga de formato
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
Interfaz: DownloadParams
Interfaz: DownloadManagerCallbacks
Clase: ElectronDownloadManager
Clase: DownloadData
clase simulada
Preguntas frecuentes
Expresiones de gratitud
$ npm instala electron-dl-manager
Querrá utilizar electron-dl-manager
en el proceso principal de su aplicación Electron donde manejará las descargas de archivos.
En este ejemplo, usamos controladores/invocadores de IPC para comunicarnos entre los procesos principal y de renderizado, pero puede usar cualquier estrategia de IPC que desee.
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// El renderizador invocaría este controlador para iniciar una descargaipcMain.handle('descargar -archivo', asíncrono (evento, argumentos) => { const {url} = argumentos; dejar descargarId const browserWindow = BrowserWindow.fromId(event.sender.id) // *Debes* llamar a manager.download() con await o // puedes obtener un comportamiento inesperado downloadId = await manager.download({window: browserWindow,url,// Si desea descargar sin guardar como diálogosaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// Si desea descargar guardando como dialogsaveDialogOptions: { title: 'Save File',},callbacks: { // el elemento es una instancia de Electron.DownloadItem onDownloadStarted: async ({ id, item, resolveFilename }) => {// Enviar el id de descarga de nuevo al renderizador junto con // con algún otro databrowserWindow.webContents.invoke('download-started', { id, // El nombre del archivo que el archivo se guardará como nombre de archivo: resolveFilename, // Obtenga el tamaño del archivo que se descargará en bytes totalBytes: item.getTotalBytes(),}); onDownloadProgress: async ({ id, item, percentCompleted }) => {// Enviar el progreso de la descarga a rendererbrowserWindow.webContents.invoke('download-progress', { id, percentCompleted, // Obtiene el número de bytes recibidos hasta el momento bytesReceived: item.getReceivedBytes(),}); onDownloadCompleted: async ({ id, item }) => {// Enviar la finalización de la descarga nuevamente a rendererbrowserWindow.webContents.invoke('download-completed', { id, // Obtener la ruta al archivo que se descargó filePath: elemento.getSavePath(),}); }, onError: (err, data) => {// ... manejar cualquier error }} }); //Pausar la descarga manager.pauseDownload(descargarId);});
ElectronDownloadManager
Gestiona las descargas de archivos en una aplicación Electron.
constructor()
constructor(parámetros: DownloadManagerConstructorParams)
interfaz DownloadManagerConstructorParams { /** * Si está definido, cerrará la sesión de los mensajes de depuración internos. Útil para * solucionar problemas de descargas. No cierra sesión en el progreso debido a * la frecuencia con la que puede ser. */ ¿debugLogger?: (mensaje: cadena) => vacío}
download()
Inicia una descarga de archivo. Devuelve la id
de la descarga.
descargar (params: DownloadParams): Promesa<cadena>
DownloadParams
interfaz DescargarParams { /** * La instancia de Electron.BrowserWindow */ ventana: ventana del navegador /** * La URL para descargar */ URL: cadena /** * Las devoluciones de llamada a definir para escuchar eventos de descarga */ devoluciones de llamada: DownloadManagerCallbacks /** * Electron.DownloadURLOptions para pasar al método downloadURL * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions?: Electron.DownloadURLOptions /** * Si está definido, mostrará un cuadro de diálogo para guardar cuando el usuario * descargue un archivo. * * @ver https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ ¿saveDialogOptions?: SaveDialogOptions /** * El nombre del archivo para guardarlo. Si no se define, se utilizará el nombre de archivo * del servidor. * * Solo se aplica si saveDialogOptions no está definido. */ ¿guardar como nombre de archivo?: cadena /** * El directorio donde guardar el archivo. Debe ser un camino absoluto. * @default El directorio de descargas del usuario */ directorio?: cadena /** * Si es verdadero, sobrescribirá el archivo si ya existe * @default false */ ¿sobrescribir?: booleano}
DownloadManagerCallbacks
interfaz DownloadManagerCallbacks { /** * Cuando la descarga ha comenzado. Cuando se utiliza un cuadro de diálogo "guardar como", * esto se llamará después de que el usuario haya seleccionado una ubicación. * * Esto siempre se llamará primero antes del progreso y los eventos completados. */ onDownloadStarted: (datos: DownloadData) => nulo /** * Cuando hay una actualización de progreso en una descarga. Nota: Este * puede omitirse por completo en algunos casos, donde la descarga * se completa inmediatamente. En ese caso, se llamará a onDownloadCompleted * en su lugar. */ onDownloadProgress: (datos: DownloadData) => nulo /** * Cuando la descarga se haya completado */ onDownloadCompleted: (datos: DownloadData) => nulo /** * Cuando la descarga ha sido cancelada. También se llama si el usuario cancela * del cuadro de diálogo Guardar como. */ onDownloadCancelled: (datos: DownloadData) => nulo /** * Cuando se ha interrumpido la descarga. Esto podría deberse a una mala * conexión, al servidor cayendo, etc. */ onDownloadInterrupted: (datos: DownloadData) => nulo /** * Cuando se ha encontrado un error. *Nota: La firma es (error, <tal vez algún dato>). */ onError: (error: Error, ¿datos?: DescargarDatos) => void}
cancelDownload()
Cancela una descarga.
cancelarDescarga(id: cadena): nulo
pauseDownload()
Pausa una descarga.
pausaDescargar(id: cadena): nulo
resumeDownload()
Reanuda una descarga.
resumeDownload(id: cadena): nulo
getActiveDownloadCount()
Devuelve el número de descargas activas.
getActiveDownloadCount(): número
getDownloadData()
Devuelve los datos de descarga para una descarga.
getDownloadData(id: cadena): DescargarData
DownloadData
Datos devueltos en las devoluciones de llamada para una descarga.
clase DescargarDatos { /** * ID generado para la descarga */ identificación: cadena /** * El Electron.DownloadItem. Utilice esto para obtener el nombre del archivo, la ruta, etc. * @see https://www.electronjs.org/docs/latest/api/download-item */ artículo: Descargar artículo /** * The Electron.WebContents * @ver https://www.electronjs.org/docs/latest/api/web-contents */ Contenidos web: Contenidos web /** * El Evento Electron * @ver https://www.electronjs.org/docs/latest/api/event */ evento: evento /** * El nombre del archivo que se guarda en la computadora del usuario. * Recomendado sobre Item.getFilename() ya que puede ser inexacto al utilizar el cuadro de diálogo Guardar como. */ nombre de archivo resuelto: cadena /** * Si es verdadero, la descarga se canceló desde el cuadro de diálogo Guardar como. Esta marca * también será verdadera si la aplicación canceló la descarga cuando * se utiliza el cuadro de diálogo Guardar como. */ cancelledFromSaveAsDialog?: booleano /** * El porcentaje de la descarga que se ha completado */ porcentaje completado: número /** * La tasa de descarga en bytes por segundo. */ descargarRateBytesPerSecond: número /** * El tiempo restante estimado en segundos. */ Tiempo estimadoRemainingSeconds: número /** * Si la descarga fue interrumpida, el estado desde el cual fue interrumpida */ interrumpidoVia?: 'en progreso' | 'terminado'}
Puede utilizar las bibliotecas bytes
y dayjs
para formatear el progreso de la descarga.
$ npm instala bytes dayjs $ npm instalar @tipos/bytes --save-dev
importar bytes desde 'bytes' importar dayjs desde 'dayjs' importar tiempo relativo desde 'dayjs/plugin/relativeTime'; importar duración desde 'dayjs/plugin/duration'; dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData = administrador.getDownloadData(id); // o DataItem de las devoluciones de llamada// Devolverá algo como 1,2 MB/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s'// Devolverá algo como "en unos segundos"const formattedEstimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, 'segundos').humanizar(verdadero)
isDownloadInProgress()
Devuelve verdadero si la descarga está en curso.
isDownloadInProgress(): booleano
isDownloadPaused()
Devuelve verdadero si la descarga está en pausa.
isDownloadPaused(): booleano
isDownloadResumable()
Devuelve verdadero si la descarga se puede reanudar.
isDownloadResumable(): booleano
isDownloadCancelled()
Devuelve verdadero si se cancela la descarga.
isDownloadCancelled(): booleano
isDownloadInterrupted()
Devuelve verdadero si se interrumpe la descarga.
isDownloadInterrupted(): booleano
isDownloadCompleted()
Devuelve verdadero si se completa la descarga.
isDownloadCompleted(): booleano
Si necesita simular ElectronDownloadManager
en sus pruebas, puede usar la clase ElectronDownloadManagerMock
.
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
no se llama. Electron DownloadItem
no proporciona una forma explícita de capturar errores de descargas en general:
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(Solo tiene eventos on('updated')
y on('done')
, que esta biblioteca utiliza para definir los controladores de devolución de llamada).
Lo que hace con las URL no válidas es que activará la devolución de llamada onDownloadCancelled()
.
ID constante = esperar administrador.descargar ({ ventana: ventana principal, URL: 'https://alkjsdflksjdflk.com/file.zip', devoluciones de llamada: {onDownloadCancelled: async (...) => { // Descarga no válida; esta devolución de llamada será llamada}, }});
Una mejor manera de manejar esto es verificar usted mismo si la URL existe antes de la descarga. No pude encontrar una biblioteca que me pareciera confiable para incluir en este paquete, por lo que es mejor que encuentre una biblioteca que funcione para usted:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT también sugiere el siguiente código (no probado):
función asíncrona urlExists (url: cadena): Promesa<boolean> { intente {respuesta constante = aguarde fetch (url, {método: 'HEAD'}); devuelva respuesta.ok; } captura (error) {return false; }}const existe = await urlExists('https://example.com/file.jpg');
Este código utiliza pequeñas porciones de electron-dl
y se indica en el código donde se utiliza.
electron-dl
tiene la licencia MIT y su mantenimiento corre a cargo de Sindre Sorhus [email protected] (https://sindresorhus.com).