主页 > 互联网  > 

electron下载文件,弹窗选择下载路径,并通知下载进度

electron下载文件,弹窗选择下载路径,并通知下载进度
1:在window.js中 引入session  import { app, BrowserWindow, ipcMain, dialog, shell, session } from 'electron'; 2:发送下载请求 // 在主进程监听渲染进程发送的 'start-download' 事件 ipcMain.on('start-download', async (event, downloadUrl) => { let win = BrowserWindow.getAllWindows()[0]; }); 3:弹窗选择路径 // 在主进程监听渲染进程发送的 'start-download' 事件 ipcMain.on('start-download', async (event, downloadUrl) => { let win = BrowserWindow.getAllWindows()[0]; const savePath = await dialog.showSaveDialog(win[0], { defaultPath: path.basename(downloadUrl), // 使用源文件名作为默认保存文件名 }); console.log(savePath.canceled, savePath.filePath); }); 4:判断下载地址,如果存在就下载,并监听发送进度 ipcMain.on('start-download', async (event, downloadUrl) => { let win = this.getAllWindows(); const savePath = await dialog.showSaveDialog(win[0], { defaultPath: path.basename(downloadUrl), // 使用源文件名作为默认保存文件名 }); console.log(savePath.canceled, savePath.filePath); if (!savePath.canceled) { const ses = session.fromPartition('persist:my-session'); // 先移除之前可能已经注册的监听器 ses.removeAllListeners('will-download'); ses.on('will-download', (event, item, webContents) => { let win = BrowserWindow.getAllWindows()[0]; const fileName = item.getFilename(); console.log(`开始下载: ${fileName}`); // const savePath = path.join('C:', 'Users', 'A', 'Downloads', fileName); item.setSavePath(savePath.filePath); win.webContents.send('download-started', { fileName }); item.on('updated', (event, state) => { if (state === 'interrupted') { console.log('下载中断...'); } else if (state === 'progressing') { if (item.isPaused()) { console.log('下载暂停...'); } else { console.log( savePath.filePath, `下载进度: ${((item.getReceivedBytes() / item.getTotalBytes()) * 100).toFixed( 2, )}%`, ); } } }); item.on('done', (event, state) => { if (state === 'completed') { console.log('文件下载完成!'); win.webContents.send('download-success', fileName); } else { console.log('下载失败'); } }); }); // 开始下载文件 const downloadItem = ses.downloadURL(downloadUrl); } }); 5:在preload.js中暴露下载以及通知操作 const { contextBridge, ipcRenderer } = require('electron'); var os = require('os'); contextBridge.exposeInMainWorld('electronAPI', { downloadSuccess: (callback) => ipcRenderer.on('download-success', (e, savePath) => callback(savePath)), downloadFailed: () => ipcRenderer.on('download-failed', (e) => callback(e)), onDownloadStarted: (url) => ipcRenderer.send('start-download', url), }); 6:在渲染进程中使用 //下载项目 const downloadProject = () => { // const fileUrl = 'http://192.168.1.999:8/server/core.jar'; // 替换为实际的文件 URL // window.electronAPI.onDownloadStarted(fileUrl); }; window.electronAPI.downloadSuccess((res) => { if (res) { console.log('success', '下载成功', `${res}下载成功,可在客户端首页打开。`); } }); window.electronAPI.downloadFailed((res) => { if (res) { console.log('error', '下载失败', '当前模型提交终端,请排查问题后重试。'); } }); 7:文件流下载 ipcMain.on('start-download', async (event, downloadUrl, fileName, Authorization) => { let win = this.getAllWindows(); const savePath = await dialog.showSaveDialog(win[0], { defaultPath: fileName, // 使用源文件名作为默认保存文件名 }); if (!savePath.canceled && savePath.filePath) { let window = BrowserWindow.getAllWindows()[0]; window.webContents.send('download-start', fileName, savePath.filePath); //文件流下载 const filePath = savePath.filePath; const response = await axios.get(downloadUrl, { headers: { ContentType: 'application/x- -form-urlencoded', Authorization, }, responseType: 'stream', }); const writer = fs.createWriteStream(filePath); response.data.pipe(writer); return new Promise((resolve, reject) => { writer.on('finish', () => { console.log('File downloaded successfully:', fs.existsSync(filePath)); window.webContents.send('download-success', fileName, filePath); }); writer.on('error', () => { window.webContents.send('download-failed'); }); }); } });

标签:

electron下载文件,弹窗选择下载路径,并通知下载进度由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“electron下载文件,弹窗选择下载路径,并通知下载进度