Um gerenciador de download de arquivos simples e fácil de usar para aplicativos Electron. Projetado em resposta aos muitos problemas em torno electron-dl
e fornece uma solução mais robusta e confiável para download de arquivos no Electron.
Casos de uso:
Baixe arquivos de um URL
Obtenha um ID associado ao download para rastreá-lo
Opcionalmente, mostre uma caixa de diálogo "Salvar como"
Receba atualizações de progresso no download
Ser capaz de cancelar/pausar/retomar downloads
Suporta vários downloads de uma só vez
É necessário o elétron 26.0.0 ou posterior.
// No processo principal // Não é um exemplo funcional, apenas uma demonstração da APIimport { ElectronDownloadManager } de 'electron-dl-manager';const manager = new ElectronDownloadManager();// Iniciar um downloadconst id = await manager.download( { janela: navegadorWindowInstance, url: 'https://example.com/file.zip', saveDialogOptions: {title: 'Salvar arquivo', }, retornos de chamada: {onDownloadStarted: async ({ id, item, webContents }) => { // Faça algo com o id de download},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: assíncrono (...) => {},onDownloadInterrupted: assíncrono (...) => {},onError: (erro, dados) => {}, }});manager.cancelDownload(id);manager.pauseDownload(id);manager.resumeDownload(id);
Gerenciador de download de arquivos Electron
Instalação
Começando
API
Propriedades
isDownloadInProgress()
isDownloadPaused()
isDownloadResumable()
isDownloadCancelled()
isDownloadInterrupted()
isDownloadCompleted()
Formatando o progresso do download
constructor()
download()
cancelDownload()
pauseDownload()
resumeDownload()
getActiveDownloadCount()
getDownloadData()
Interface: DownloadParams
Interface: DownloadManagerCallbacks
Classe: ElectronDownloadManager
Classe: DownloadData
Aula simulada
Perguntas frequentes
Agradecimentos
$ npm instalar o gerenciador de elétrons
Você desejará usar electron-dl-manager
no processo principal do seu aplicativo Electron, onde lidará com os downloads de arquivos.
Neste exemplo, usamos manipuladores/invocadores IPC para comunicação entre os processos principal e de renderização, mas você pode usar qualquer estratégia IPC que desejar.
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const manager = new ElectronDownloadManager();// O renderizador invocaria este manipulador para iniciar um downloadipcMain.handle('download -arquivo', assíncrono (evento, argumentos) => { const {url} = argumentos; deixe downloadId const browserWindow = BrowserWindow.fromId(event.sender.id) // Você *deve* chamar manager.download() com await ou // você pode ter um comportamento inesperado downloadId = await manager.download({window: browserWindow,url,// Se você deseja baixar sem salvar como dialogsaveAsFilename: 'file.zip',directory: '/directory/where/to/save',// Se você deseja fazer o download salvando como dialogsaveDialogOptions: { title: 'Save File',},callbacks: { // item é uma instância de Electron.DownloadItem onDownloadStarted: async ({ id, item, resolveFilename }) => {// Envie o ID de download de volta para o renderizador junto // com algum outro databrowserWindow.webContents.invoke('download-started', { id, // O nome do arquivo que o o arquivo será salvo como filename: resolveFilename, // Obtenha o tamanho do arquivo a ser baixado em bytes totalBytes: item.getTotalBytes(),} }, onDownloadProgress: async ({ id, item, percentCompleted }) => {// Envie o progresso do download de volta para o rendererbrowserWindow.webContents.invoke('download-progress', { id, percentCompleted, // Obtenha o número de bytes recebidos até agora bytesReceived : item.getReceivedBytes(),} }), onDownloadCompleted: async ({ id, item }) => {// Envia a conclusão do download de volta ao rendererbrowserWindow.webContents.invoke('download-completed', { id, // Obtenha o caminho para o arquivo que foi baixado filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... trata de quaisquer erros }} }); //Pausa o download manager.pauseDownload(downloadId);});
ElectronDownloadManager
Gerencia downloads de arquivos em um aplicativo Electron.
constructor()
construtor (parâmetros: DownloadManagerConstructorParams)
interface DownloadManagerConstructorParams { /** * Se definido, desconectará mensagens de depuração internas. Útil para * solucionar problemas de downloads. Não efetua logout do progresso devido à * frequência com que ele pode ser. */ debugLogger?: (mensagem: string) => void}
download()
Inicia um download de arquivo. Retorna o id
do download.
download(params: DownloadParams): Promessa<string>
DownloadParams
interface DownloadParams { /** * A instância Electron.BrowserWindow */ janela: Janela do navegador /** * URL para download */ URL: string /** * Os retornos de chamada a serem definidos para escutar eventos de download */ retornos de chamada: DownloadManagerCallbacks /** * Electron.DownloadURLOptions para passar para o método downloadURL * * @see https://www.electronjs.org/docs/latest/api/session#sesdownloadurlurl-options */ downloadURLOptions?: Electron.DownloadURLOptions /** * Se definido, mostrará uma caixa de diálogo para salvar quando o usuário * fizer download de um arquivo. * * @see https://www.electronjs.org/docs/latest/api/dialog#dialogshowsavedialogbrowserwindow-options */ saveDialogOptions?: SaveDialogOptions /** * O nome do arquivo para salvar o arquivo. Se não for definido, será usado o nome do arquivo * do servidor. * * Aplica-se apenas se saveDialogOptions não estiver definido. */ saveAsFilename?: string /** * O diretório no qual salvar o arquivo. Deve ser um caminho absoluto. * @default O diretório de downloads do usuário */ diretório?: string /** * Se verdadeiro, substituirá o arquivo se ele já existir * @default false */ substituir?: booleano}
DownloadManagerCallbacks
interface DownloadManagerCallbacks { /** * Quando o download for iniciado. Ao usar uma caixa de diálogo "salvar como", * será chamado depois que o usuário selecionar um local. * * Isso sempre será chamado primeiro, antes do progresso e dos eventos concluídos. */ onDownloadStarted: (dados: DownloadData) => void /** * Quando há uma atualização de progresso em um download. Nota: Este * pode ser totalmente ignorado em alguns casos, onde o download * é concluído imediatamente. Nesse caso, onDownloadCompleted * será chamado. */ onDownloadProgress: (dados: DownloadData) => void /** * Quando o download for concluído */ onDownloadCompleted: (dados: DownloadData) => void /** * Quando o download foi cancelado. Também chamado se o usuário cancelar * na caixa de diálogo salvar como. */ onDownloadCancelled: (dados: DownloadData) => void /** * Quando o download foi interrompido. Isso pode ser devido a uma conexão ruim *, queda do servidor, etc. */ onDownloadInterrupted: (dados: DownloadData) => void /** * Quando um erro foi encontrado. * Nota: A assinatura é (erro, <talvez alguns dados>). */ onError: (erro: Erro, dados?: DownloadData) => void}
cancelDownload()
Cancela um download.
cancelarDownload(id:string): void
pauseDownload()
Pausa um download.
pauseDownload(id:string): void
resumeDownload()
Retoma um download.
currículoDownload(id: string): void
getActiveDownloadCount()
Retorna o número de downloads ativos.
getActiveDownloadCount(): número
getDownloadData()
Retorna os dados de download para um download.
getDownloadData(id:string): DownloadData
DownloadData
Dados retornados nos retornos de chamada para download.
classe DownloadData { /** * ID gerado para o download */ identificação: string /** * O Electron.DownloadItem. Use isto para obter o nome do arquivo, caminho, etc. * @see https://www.electronjs.org/docs/latest/api/download-item */ item: DownloadItem /** * The Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ webContents: WebContents /** * O Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ evento: Evento /** * O nome do arquivo que está sendo salvo no computador do usuário. * Recomendado em vez de Item.getFilename() pois pode ser impreciso ao usar a caixa de diálogo salvar como. */ nome do arquivo resolvido: string /** * Se verdadeiro, o download foi cancelado na caixa de diálogo salvar como. Este sinalizador * também será verdadeiro se o download tiver sido cancelado pelo aplicativo ao * usar a caixa de diálogo salvar como. */ canceladoFromSaveAsDialog?: booleano /** * A porcentagem do download que foi concluído */ porcentagem concluída: número /** * A taxa de download em bytes por segundo. */ downloadRateBytesPerSecond: número /** * O tempo restante estimado em segundos. */ estimadoTimeRemainingSeconds: número /** * Se o download foi interrompido, o estado em que foi interrompido */ interrompidoVia?: 'em andamento' | 'concluído'}
Você pode usar as bibliotecas bytes
e dayjs
para formatar o progresso do download.
$ npm instalar bytes dayjs $ npm install @tipos/bytes --save-dev
importar bytes de 'bytes' importar dayjs de 'dayjs' importar relativoTime de 'dayjs/plugin/relativeTime'; importar duração de 'dayjs/plugin/duration'; dayjs.extend(relativeTime);dayjs.extend(duration);const downloadData =gerente.getDownloadData(id); // ou DataItem dos retornos de chamada// Retornará algo como 1,2 MB/sconst formattedDownloadRate = bytes(downloadData.downloadRateBytesPerSecond, { unitSeparator: ' ' }) + '/s'// Retornará algo como "em alguns segundos"const formatadoEstimatedTimeRemaining = dayjs.duration(downloadData.estimatedTimeRemainingSeconds, 'segundos').humanizar(verdadeiro)
isDownloadInProgress()
Retorna verdadeiro se o download estiver em andamento.
isDownloadInProgress(): booleano
isDownloadPaused()
Retorna verdadeiro se o download estiver pausado.
isDownloadPaused(): booleano
isDownloadResumable()
Retorna verdadeiro se o download for retomável.
isDownloadResumable(): booleano
isDownloadCancelled()
Retorna verdadeiro se o download for cancelado.
isDownloadCancelled(): booleano
isDownloadInterrupted()
Retorna verdadeiro se o download for interrompido.
isDownloadInterrupted(): booleano
isDownloadCompleted()
Retorna verdadeiro se o download for concluído.
isDownloadCompleted(): booleano
Se precisar simular ElectronDownloadManager
em seus testes, você pode usar a classe ElectronDownloadManagerMock
.
import { ElectronDownloadManagerMock } from 'electron-dl-manager'
onError()
não está sendo chamado. Electron DownloadItem
não fornece uma maneira explícita de capturar erros de downloads em geral:
https://www.electronjs.org/docs/latest/api/download-item#class-downloaditem
(Ela possui apenas eventos on('updated')
e on('done')
, que esta biblioteca usa para definir os manipuladores de retorno de chamada.)
O que faz para URLs inválidos, acionará o retorno de chamada onDownloadCancelled()
.
const id = aguarda manager.download({ janela: janela principal, url: 'https://alkjsdflksjdflk.com/file.zip', retornos de chamada: {onDownloadCancelled: async (...) => { // Download inválido; esse retorno de chamada será chamado}, }});
A melhor maneira de lidar com isso é verificar você mesmo se o URL existe antes do download. Não consegui encontrar uma biblioteca que considerasse confiável para incluir neste pacote, então é melhor você encontrar uma biblioteca que funcione para você:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT também sugere o seguinte código (não testado):
função assíncrona urlExists(url: string): Promise<boolean> { tente {const response = await fetch(url, {método: 'HEAD' });return response.ok; } catch (erro) {retornar falso; }}const existe = aguarda urlExists('https://example.com/file.jpg');
Este código usa pequenas porções do electron-dl
e é anotado no código onde é usado.
electron-dl
é licenciado sob a licença MIT e é mantido por Sindre Sorhus [email protected] (https://sindresorhus.com).