electron will-download 实现多个文件下载,并监听多个下载进度条,和下载的开始和关闭
时间: 2024-02-20 10:59:21 浏览: 354
要实现多个文件下载并监听多个下载进度条,可以使用 Electron 的`session`模块来实现。`session`模块可以创建一个新的会话来控制网站的请求和响应,从而实现多个文件的下载。
以下是一个简单的示例代码,可以实现多个文件下载,并监听多个下载进度条,以及下载的开始和关闭:
```javascript
const { app, BrowserWindow, session, ipcMain } = require('electron')
const path = require('path')
const url = require('url')
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
mainWindow.loadFile('index.html')
mainWindow.on('closed', function () {
mainWindow = null
})
}
app.on('ready', () => {
createWindow()
ipcMain.on('download', (event, arg) => {
let urls = arg.urls
let savePaths = arg.savePaths
let progressBars = []
for (let i = 0; i < urls.length; i++) {
let request = session.defaultSession.downloadURL(urls[i], {
saveAs: true,
directory: path.dirname(savePaths[i]),
filename: path.basename(savePaths[i])
})
let progressBar = {
id: i,
request: request,
progress: 0
}
progressBars.push(progressBar)
request.on('progress', (bytesReceived, totalBytes) => {
progressBar.progress = Math.round(bytesReceived / totalBytes * 100)
mainWindow.webContents.send('download-progress', progressBars)
})
request.on('done', (event, state) => {
if (state === 'completed') {
mainWindow.webContents.send('download-completed', i)
} else {
mainWindow.webContents.send('download-failed', i)
}
})
}
mainWindow.webContents.send('download-started', progressBars)
})
})
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})
```
上述代码中,`ipcMain`模块监听了一个`download`事件,该事件会传递一个包含多个下载链接、保存路径的参数对象。在事件处理函数中,使用`session.defaultSession.downloadURL()`方法来下载文件,并为每个下载请求创建一个进度条对象。每当有下载进度变化时,通过`mainWindow.webContents.send()`方法向主进程发送进度条数组。当下载完成时,也通过`mainWindow.webContents.send()`方法向主进程发送完成或失败的消息。
在渲染进程中,可以通过`ipcRenderer`模块来接收和处理主进程发送的消息,进而更新UI。
这里提供了一个简单的示例,实际应用中还需要根据具体需求进行调整和优化。
阅读全文