sindresorhus / electron-dl

Simplified file downloads for your Electron app
MIT License
1.16k stars 137 forks source link

Cannot read property 'fromWebContents' of undefined #28

Open salehmosleh opened 7 years ago

salehmosleh commented 7 years ago

i use below codes :

download(BrowserWindow.getFocusedWindow(), url ,{saveAs:true,openFolderWhenDone:true,onProgress:function(pr){ //console.log(pr+" - "); }}) .then(dl => console.log(dl.getSavePath())) .catch(console.error);

but i get this error in consol :

E:\nodejs\bireport\node_modules\electron-dl\index.js:37 Uncaught TypeError: Cannot read property 'fromWebContents' of undefined at listener (E:\nodejs\bireport\node_modules\electron-dl\index.js:37) at CallbacksRegistry.apply (E:\nodejs\bireport\node_modules\electron\dist\resources\electron.asar\common\api\callbacks-registry…:48) at EventEmitter. (E:\nodejs\bireport\node_modules\electron\dist\resources\electron.asar\renderer\api\remote.js:283) at emitThree (events.js:116) at EventEmitter.emit (events.js:194) listener @ E:\nodejs\bireport\node_modules\electron-dl\index.js:37 apply @ E:\nodejs\bireport\node_modules\electron\dist\resources\electron.asar\common\api\callbacks-registry…:48 (anonymous) @ E:\nodejs\bireport\node_modules\electron\dist\resources\electron.asar\renderer\api\remote.js:283 emitThree @ events.js:116 emit @ events.js:194

how can i fix it ?

WellMafra commented 6 years ago

@salehmosleh any news?

salehmosleh commented 6 years ago

@WellMafra , we have to run electron-dl codes on Main side (main.js), if you need run it on render side , use ipcMain/IPCRenderer to send request to Main side.

const {app, BrowserWindow, ipcMain} = require('electron');
const {download} = require('electron-dl');

ipcMain.on('download-btn', (e, args) => {
    download(BrowserWindow.getFocusedWindow(), args.url)
        .then(dl => console.log(dl.getSavePath()))
        .catch(console.error);
});

also i want to use electron-download-manager , it is better for me.

pedrobertao commented 6 years ago

Any news on how to solve this ? @salehmosleh

salehmosleh commented 6 years ago

@pedrobertao , i explain it on the above.

chrispavlopoulos commented 11 months ago

Just to clarify for anyone in the future: you CAN NOT use electron-dl functions from your preload script. You must declare the download function in your main file and communicate between main.js and preload.js by using ipcMain and ipcRenderer.

This is what worked for me:

// main.js
const electronDl = require('electron-dl');
electronDl();

app.on('ready', () => {
    ipcMain.on('electron-dl-download', async (event, { url }) => {
      const win = BrowserWindow.getFocusedWindow();
        try {
            console.log(await electronDl.download(win, url));
        } catch (error) {
            if (error instanceof electronDl.CancelError) {
              console.info('item.cancel() was called');
        } else {
          console.error(error);
        }
      }
    });
});

// preload.js
const { ipcRenderer } = require('electron');

window.download = (args) => {
  ipcRenderer.send("electron-dl-download", args);
};