Простой и удобный менеджер загрузки файлов для приложений Electron. Разработан в ответ на множество проблем, связанных с electron-dl
, и обеспечивает более надежное и надежное решение для загрузки файлов в Electron.
Варианты использования:
Загрузка файлов с URL-адреса
Получите идентификатор, связанный с загрузкой, чтобы отслеживать ее.
При необходимости отобразить диалоговое окно «Сохранить как».
Получайте обновления о ходе загрузки
Возможность отменить/приостановить/возобновить загрузку.
Поддержка нескольких загрузок одновременно
Требуется Electron 26.0.0 или новее.
// В основном процессе // Не рабочий пример, просто демонстрация APIimport { ElectronDownloadManager } из 'electron-dl-manager';const Manager = new ElectronDownloadManager();// Начать загрузкуconst id = await Manager.download( { окно: браузервиндовинстанце, URL: 'https://example.com/file.zip', saveDialogOptions: {title: 'Сохранить файл', }, обратные вызовы: {onDownloadStarted: async ({ id, item, webContents }) => { // Делаем что-нибудь с идентификатором загрузки},onDownloadProgress: async (...) => {},onDownloadCompleted: async (...) = > {},onDownloadCancelled: async (...) => {},onDownloadInterrupted: async (...) => {},onError: (ошибка, данные) => {}, }});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 установить электронный-dl-менеджер
Вам понадобится использовать electron-dl-manager
в основном процессе вашего приложения Electron, где вы будете обрабатывать загрузки файлов.
В этом примере мы используем обработчики/вызовы IPC для связи между основным процессом и процессом рендеринга, но вы можете использовать любую стратегию IPC, какую захотите.
// MainIpcHandlers.tsimport { ElectronDownloadManager } from 'electron-dl-manager';import { ipcMain } from 'electron';const Manager = new ElectronDownloadManager();// Средство рендеринга вызовет этот обработчик для запуска загрузкиipcMain.handle('download -file', async (событие, аргументы) => { const {url} = аргументы; пусть загрузитсяId const BrowserWindow = BrowserWindow.fromId(event.sender.id) // Вы *должны* вызвать менеджер.download() с помощью await или // вы можете получить неожиданное поведение downloadId = await Manager.download({window: BrowseWindow,url,// Если вы хотите скачать без сохранения в виде диалога, saveAsFilename: 'file.zip',directory: '/directory/where/to/save',// Если вы хотите загрузить с сохранением в виде диалога saveDialogOptions: { title: 'Save File',}, callbacks: { // элемент является экземпляром Electron.DownloadItem onDownloadStarted: async ({ id, item,solveFilename }) => {// Отправляем идентификатор загрузки обратно в средство рендеринга вместе // с каким-либо другим databrowserWindow.webContents.invoke('download-started', { id, // Имя файла что файл будет сохранен как имя файла:solveFilename, // Получаем размер загружаемого файла в байтах totalBytes: item.getTotalBytes(),}); }, onDownloadProgress: async ({ id, item, PercentCompleted }) => {// Отправляем прогресс загрузки обратно в rendererbrowserWindow.webContents.invoke('download-progress', { id, процентовCompleted, // Получаем количество полученных на данный момент байтов bytesReceived: item.getReceivedBytes(),}); }, onDownloadCompleted: async ({ id, item }) => {// Отправляем завершение загрузки обратно в rendererbrowserWindow.webContents.invoke('download-completed', { id, // Получить путь к загруженному файлу filePath: item.getSavePath(),}); }, onError: (err, data) => {// ... обрабатывать любые ошибки }} }); // Приостановить загрузку менеджер.pauseDownload(downloadId);});
ElectronDownloadManager
Управляет загрузкой файлов в приложении Electron.
constructor()
конструктор (параметры: DownloadManagerConstructorParams)
интерфейс DownloadManagerConstructorParams { /** * Если определено, будут выходить внутренние сообщения отладки. Полезно * для устранения неполадок при загрузке. Не выводит прогресс из-за * того, насколько часто это может происходить. */ debugLogger?: (сообщение: строка) => void}
download()
Начинает загрузку файла. Возвращает id
загрузки.
download(params: DownloadParams): Promise<string>
DownloadParams
интерфейс DownloadParams { /** * Экземпляр Electron.BrowserWindow */ окно: Браузервиндов /** * URL-адрес для загрузки */ URL: строка /** * Обратные вызовы, которые необходимо определить для прослушивания событий загрузки */ обратные вызовы: DownloadManagerCallbacks /** * Electron.DownloadURLOptions для перехода к методу downloadURL * * @see 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 не определен. */ saveAsFilename?: строка /** * Каталог, в котором будет сохранен файл. Должен быть абсолютный путь. * @default Каталог загрузок пользователя */ каталог?: строка /** * Если true, файл будет перезаписан, если он уже существует * @default false */ перезаписать?: логическое значение}
DownloadManagerCallbacks
интерфейс DownloadManagerCallbacks { /** * Когда загрузка началась. При использовании диалогового окна «Сохранить как» оно будет вызываться после того, как пользователь выберет местоположение. * * Это всегда будет вызываться перед ходом и завершенными событиями. */ onDownloadStarted: (данные: DownloadData) => void /** * При наличии обновления хода загрузки. Примечание. В некоторых случаях это * можно полностью пропустить, если загрузка * завершается немедленно. В этом случае вместо этого будет вызван onDownloadCompleted *. */ onDownloadProgress: (данные: DownloadData) => void /** * Когда загрузка завершена */ onDownloadCompleted: (данные: DownloadData) => void /** * Когда загрузка была отменена. Также вызывается, если пользователь отменяет * из диалогового окна сохранения как. */ onDownloadCancelled: (данные: DownloadData) => void /** * Когда загрузка была прервана. Это может быть связано с плохим * соединением, сбоем сервера и т. д. */ onDownloadInterrupted: (данные: DownloadData) => void /** * При обнаружении ошибки. * Примечание: подпись (ошибка, <возможно какие-то данные>). */ onError: (ошибка: Ошибка, данные?: DownloadData) => void}
cancelDownload()
Отменяет загрузку.
cancelDownload (id: строка): пустота
pauseDownload()
Приостанавливает загрузку.
паузаDownload (id: строка): пустота
resumeDownload()
Возобновляет загрузку.
резюмеDownload (идентификатор: строка): пустота
getActiveDownloadCount()
Возвращает количество активных загрузок.
getActiveDownloadCount(): число
getDownloadData()
Возвращает данные загрузки для загрузки.
getDownloadData (id: строка): DownloadData
DownloadData
Данные, возвращаемые в обратных вызовах для загрузки.
класс DownloadData { /** * Сгенерированный идентификатор для загрузки */ идентификатор: строка /** * Элемент Electron.DownloadItem. Используйте это, чтобы получить имя файла, путь и т. д. * @see https://www.electronjs.org/docs/latest/api/download-item */ элемент: DownloadItem /** * The Electron.WebContents * @see https://www.electronjs.org/docs/latest/api/web-contents */ веб-содержание: веб-содержание /** * The Electron.Event * @see https://www.electronjs.org/docs/latest/api/event */ событие: Событие /** * Имя файла, сохраняемого на компьютере пользователя. * Рекомендуется вместо Item.getFilename(), так как это может быть неточно при использовании диалога сохранения как. */ разрешеноимя_файла: строка /** * Если true, загрузка была отменена в диалоговом окне сохранения как. Этот флаг * также будет истинным, если загрузка была отменена приложением * при использовании диалогового окна «Сохранить как». */ cancelledFromSaveAsDialog?: логическое значение /** * Процент завершенной загрузки */ процент завершения: число /** * Скорость загрузки в байтах в секунду. */ downloadRateBytesPerSecond: число /** * Расчетное оставшееся время в секундах. */ оцененноеTimeRemainingSeconds: число /** * Если загрузка была прервана, то состояние, в котором она была прервана */ ПрерваноVia?: «в процессе» | 'завершенный'}
Вы можете использовать библиотеки 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 = Manager.getDownloadData(id); // или DataItem из обратных вызовов // Вернет что-то вроде 1,2 МБ/сconst 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', обратные вызовы: {onDownloadCancelled: async (...) => { // Неверная загрузка; этот обратный вызов будет вызван}, }});
Лучший способ справиться с этой проблемой — проверить, существует ли URL-адрес перед загрузкой самостоятельно. Я не смог найти библиотеку, которую, по моему мнению, можно было бы включить в этот пакет, поэтому лучше всего найти библиотеку, которая подойдет вам:
https://www.npmjs.com/search?q=url%20exists&ranking=maintenance
GPT также предлагает следующий код (непроверенный):
асинхронная функция urlExists(url: string): Promise<boolean> { попробуйте {const ответ = ожидайте выборки (url, {метод: 'HEAD'}); return response.ok; } catch (ошибка) {return false; }}const существует = ждут urlExists('https://example.com/file.jpg');
Этот код использует небольшие части из electron-dl
и отмечен в коде, где он используется.
electron-dl
лицензируется в соответствии с лицензией MIT и поддерживается Sindre Sorhus [email protected] (https://sindresorhus.com).