Electron 项目实现下载文件监听

Electron 项目实现下载文件监听

随着现代应用程序功能的不断扩展,用户对下载文件的需求也越来越高。特别是在 Electron 应用程序中,提供一个高效、可靠的下载管理功能是提升用户体验的
关键之一。本文将详细介绍如何在 Electron 项目中实现下载文件的监控,包括进度信息的实时更新,并将这些信息返回给前端。同时,还会讲解如何避免用户点击下载按钮时弹出下载对话框,
直接下载到设置的默认路径。本文将为你提供详细的步骤和代码示例,帮助你快速实现这一功能。

目标
  1. 实现下载文件的监听,包括下载进度和最终状态。
  2. 将下载详细信息发送到前端并实时显示。
  3. 避免用户点击下载按钮时弹出下载对话框,直接下载到设置的默认路径。
步骤
  1. 设置项目环境
  2. 创建主窗口
  3. 监听下载事件
  4. 发送下载状态到前端
  5. 前端接收并显示下载状态
  6. 避免弹出下载对话框

1. 设置项目环境

首先,确保你已经安装了 Electron。如果还没有安装,可以使用以下命令进行安装:

npm install electron --save-dev

2. 创建主窗口

在项目的主文件(通常是 main.js)中,创建主窗口并加载前端页面。

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,preload: path.join(__dirname, 'preload.js')}});mainWindow.loadFile('index.html');
}app.on('ready', async () => {await createWindow();
});

3. 监听下载事件

main.js 中,监听 will-download 事件,设置默认下载路径,并监控下载状态。

const { app, BrowserWindow, session, ipcMain } = require('electron');
const path = require('path');let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,preload: path.join(__dirname, 'preload.js')}});mainWindow.loadFile('index.html');
}app.on('ready', async () => {await createWindow();let session = mainWindow.webContents.session;session.on('will-download', (event, item, webContents) => {// 获取当前用户的下载文件夹路径const defaultDownloadPath = app.getPath('downloads');const suggestedFileName = item.getFilename();const savePath = path.join(defaultDownloadPath, suggestedFileName);// 设置下载项的保存路径item.setSavePath(savePath);// 发送下载开始信息到前端mainWindow.webContents.send('download-started', { filename: suggestedFileName, savePath });// 初始化已接收字节数let receivedBytes = 0;// 监听下载进度item.on('updated', (event, state) => {if (state === 'interrupted') {mainWindow.webContents.send('download-interrupted', { filename: suggestedFileName });} else if (state === 'progressing') {if (item.isPaused()) {mainWindow.webContents.send('download-paused', { filename: suggestedFileName });} else {receivedBytes = item.getReceivedBytes();let progress = Math.round((receivedBytes / item.getTotalBytes()) * 100);mainWindow.webContents.send('download-progress', { filename: suggestedFileName, progress });}}});// 监听下载完成item.once('done', (event, state) => {if (state === 'completed') {mainWindow.webContents.send('download-completed', { filename: suggestedFileName, savePath });} else {mainWindow.webContents.send('download-failed', { filename: suggestedFileName, error: state });}});});
});

4. 发送下载状态到前端

在上面的代码中,我们使用 mainWindow.webContents.send 方法将下载状态发送到前端。这些状态包括下载开始、下载进度、下载中断、下载暂停和下载完成。

5. 前端接收并显示下载状态

在前端页面(通常是 index.html)中,使用 Electron 的 ipcRenderer 模块接收这些状态并显示。

index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Electron Download Monitor</title><style>body {font-family: Arial, sans-serif;}.download-status {margin-top: 20px;}</style>
</head>
<body><h1>Electron Download Monitor</h1><button id="download-button">开始下载</button><div id="download-status" class="download-status"></div><script src="renderer.js"></script>
</body>
</html>
renderer.js
const { ipcRenderer } = require('electron');document.getElementById('download-button').addEventListener('click', () => {// 触发下载操作ipcRenderer.send('start-download');
});// 监听下载开始事件
ipcRenderer.on('download-started', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载开始: ${data.filename}${data.savePath}</p>`;
});// 监听下载进度事件
ipcRenderer.on('download-progress', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载进度: ${data.filename} - ${data.progress}%</p>`;
});// 监听下载中断事件
ipcRenderer.on('download-interrupted', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载中断: ${data.filename}</p>`;
});// 监听下载暂停事件
ipcRenderer.on('download-paused', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载暂停: ${data.filename}</p>`;
});// 监听下载完成事件
ipcRenderer.on('download-completed', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载完成: ${data.filename} 保存到 ${data.savePath}</p>`;
});// 监听下载失败事件
ipcRenderer.on('download-failed', (event, data) => {const statusDiv = document.getElementById('download-status');statusDiv.innerHTML += `<p>下载失败: ${data.filename} - 错误: ${data.error}</p>`;
});

6. 避免弹出下载对话框

在上面的代码中,我们已经在 will-download 事件的回调函数中设置了默认下载路径,从而避免弹出下载对话框。具体代码如下:

session.on('will-download', (event, item, webContents) => {// 获取当前用户的下载文件夹路径const defaultDownloadPath = app.getPath('downloads');const suggestedFileName = item.getFilename();const savePath = path.join(defaultDownloadPath, suggestedFileName);// 设置下载项的保存路径item.setSavePath(savePath);// 发送下载开始信息到前端mainWindow.webContents.send('download-started', { filename: suggestedFileName, savePath });// 初始化已接收字节数let receivedBytes = 0;// 监听下载进度item.on('updated', (event, state) => {if (state === 'interrupted') {mainWindow.webContents.send('download-interrupted', { filename: suggestedFileName });} else if (state === 'progressing') {if (item.isPaused()) {mainWindow.webContents.send('download-paused', { filename: suggestedFileName });} else {receivedBytes = item.getReceivedBytes();let progress = Math.round((receivedBytes / item.getTotalBytes()) * 100);mainWindow.webContents.send('download-progress', { filename: suggestedFileName, progress });}}});// 监听下载完成item.once('done', (event, state) => {if (state === 'completed') {mainWindow.webContents.send('download-completed', { filename: suggestedFileName, savePath });} else {mainWindow.webContents.send('download-failed', { filename: suggestedFileName, error: state });}});
});

总结

通过以上步骤,你可以在 Electron 项目中实现下载文件的监控,并将下载状态(包括进度信息)返回给前端。这样,用户可以实时看到下载的进度和结果。从设置项目环境到监听下载事件,再到将下载状态发送到前端并实时显示,每一步都经过详细讲解和代码示例展示。此外,还讲解了如何避免用户点击下载按钮时弹出下载对话框,直接下载到设置的默认路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14837.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DAY112代码审计PHP开发框架POP链利用Yii反序列化POP利用链

一、pop1链的跟踪 1、路由关系 2、漏洞触发口unserialize(base64_decode($data)); 2、__destruct()&#xff0c;魔术法方法调用close函数方法 3、未找到利用链&#xff0c;尝试__call魔术方法 4、逆推找call_user_func 函数 第一部分 namespace yii\db; class BatchQueryResu…

移动硬盘需要格式化才能打开?详解原因与数据恢复方案

描述移动硬盘需要格式化才能打开 当我们尝试访问移动硬盘时&#xff0c;有时会遇到系统提示“需要格式化才能打开”的情况。这种提示通常意味着硬盘上的文件系统已损坏或无法被系统正常识别。一旦遇到这种情况&#xff0c;很多用户会感到焦虑&#xff0c;因为硬盘中可能存储了…

Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…

项目技术栈-解决方案-注册中心

项目技术栈-解决方案-注册中心 Zookeeper、Eureka、Nacos、Consul和Etcd参考文章 服务注册中心&#xff08;Registry&#xff09;&#xff1a;用于保存 RPC Server 的注册信息&#xff0c;当 RPC Server 节点发生变更时&#xff0c;Registry 会同步变更&#xff0c;RPC Client …

力扣 LeetCode 454. 四数相加II(Day3:哈希表)

解题思路&#xff1a; 使用map 四个数组两两一组 前两个数组的各个值遍历相加&#xff0c;和为key&#xff0c;出现的次数为value 后两个数组的各个值遍历相加&#xff0c;如果该值的负数能在map中找到&#xff08;表示能抵消为0&#xff0c;符合题意四数之和为0&#xff0…

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …

现代电商解决方案:Spring Boot框架实践

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#…

unity3d————协程原理讲解

1.协程的本质 协程可以分成两部分1.协程函数本体 2.协程调度器 协程本体就是一个能够中间暂停返回的函数 协程调度器是Unity内部实现的&#xff0c;会在对应的时机帮助我们继续执行协程函数 Unity只实现了协程调度部分协程的本体本质上就是一个 C#的迭代器方法 2.协程本体是…

社区物资交易互助平台(程序+数据库+报告)

基于Spring Boot框架实现的社区物资交易互助平台&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块&#xff0c;主要功能如下。 【前台】&#xff1a; - 首页&#xff1a;展示平台的概览信息和热门内容。 - 论坛&#xff1a;提供一个交流讨论…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术&#xff0c;是一种新计算范式&#xff1b;区块链是Web3.0的核心技术之一&#xff0c;有助于保障开放零信任环境下&#xff0c;用户、设备和服务间去中心化数据流通的…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下&#xff1a; 1.打开HTTP信息头管理器 &#xff1a; 首先&#xff0c;你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击&#xff0c;然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

ROS Action

在 ROS 中&#xff0c;Action 是一种支持长时间异步任务的通信机制。与 Service 不同&#xff0c;Action 允许客户端发起一个请求&#xff0c;并在任务执行的过程中不断接收反馈&#xff0c;直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务&#xff0c;比如机器…

江苏省考公务员报名照片要求及处理方法

随着江苏省公务员考试的临近&#xff0c;许多考生已经开始准备报名所需的各项材料&#xff0c;其中照片的准备尤为重要。本文将详细介绍江苏省考公务员报名照片的具体要求以及如何使用手机拍照并处理照片&#xff0c;确保您的报名过程顺利进行。 一、江苏省公务员招录考试报名照…

计算机网络学习笔记-3.2介质访问控制

文章目录 介质访问控制静态划分信道 动态分配信道轮询访问介质访问控制随机访问介质访问控制ALOHA协议简介ALOHA协议的工作原理 介质访问控制 介质访问控制&#xff08;MAC&#xff0c;Medium Access Control&#xff09;&#xff0c;质访问控制的目的是确保多个设备能够高效、…

软件测试-巨量测试开发

软件测试-巨量测试 编辑时间&#xff1a;2024/11/13 软件测试基础知识 软件测试定义和测试分类 软件是计算机程序、程序所用的数据以及有关文档资料的集合。 软件测试分类 按测试执行阶段划分 单元测试、集成测试、系统测试、验收测试 是否运行程序划分 动态测试、静态测试…

pycharm中from[本地包]import文件/模块出现问题(最最最全方法!)

1.通过PYTHONPATH的方法在此处将路径添加上&#xff0c;能够让IDE访问得到。 2.通过选中目标文件所在的文件的文件夹单击右键&#xff0c;如下图所示可以看到下方的mark directory as选项中存在 存在excluded&#xff0c;选择此项可解决问题&#xff0c;如果仍有问题可以尝试其…

【日志】Unity——Roll-A-Ball(二)

2024.11.13 【Unity】 3.搭建游戏场景 4.设置可拾取物品 4.1设置可拾取方块 给予一定的变化和颜色 编写方块旋转脚本Rotator.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class Rotator : MonoBehaviour {// Update is cal…

机器学习(1)线性回归

前言   线性回归算法是机器学习深度学习入门的必学的算法&#xff0c;其算法原理虽然简单&#xff0c;但是却蕴含着机器学习中的一些重要的基本思想。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。同时机器学习深度学习的核心思想就是优…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片&#xff08;sharding&#xff0c;水平切分&#xff09;来进行数据共享&#xff0c;并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点&#xff08;node&#xff09;组成&#xff0c;在刚开…