当前位置: 首页 > article >正文

electron下载文件

const http = require('http');
const https = require('https');
const fs = require('fs');
const { URL } = require('url');
const path = require('path');// 下载文件函数
function downloadFile(url, savePath) {return new Promise((resolve, reject) => {try {console.log(`开始下载: ${url}`);console.log(`保存路径: ${savePath}`);const parsedUrl = new URL(url);const protocol = parsedUrl.protocol === 'https:' ? https : http;// 创建保存目录(如果不存在)const saveDir = path.dirname(savePath);fs.mkdirSync(saveDir, { recursive: true });const fileStream = fs.createWriteStream(savePath);const request = protocol.get(url, (response) => {if (response.statusCode !== 200) {reject(new Error(`HTTP错误,状态码: ${response.statusCode}`));return;}const totalBytes = parseInt(response.headers['content-length'], 10) || 0;let receivedBytes = 0;response.on('data', (chunk) => {receivedBytes += chunk.length;const progress = totalBytes > 0 ? (receivedBytes / totalBytes) * 100 : 0;console.log(`下载进度: ${progress.toFixed(2)}%`);});response.on('end', () => {fileStream.end();console.log('下载完成');resolve(savePath);});response.on('error', (error) => {console.error('响应流错误:', error);fileStream.destroy();reject(error);});// 将响应数据管道传输到文件流response.pipe(fileStream);});request.on('error', (error) => {console.error('请求错误:', error);fileStream.destroy();reject(error);});request.on('timeout', () => {console.error('请求超时');request.destroy();fileStream.destroy();reject(new Error('请求超时'));});// 设置超时时间(30秒)request.setTimeout(30000);request.end();} catch (error) {console.error('下载过程中发生异常:', error);reject(error);}});
}// 检查更新并下载
async function checkAndDownloadUpdate() {try {console.log('检测更新...');const updateUrl = "http://dade.dddxxxx.com/app/dade.zip";// 使用当前目录下的downloads文件夹作为保存位置const savePath = path.join(__dirname, 'downloads', 'dade.zip');await downloadFile(updateUrl, savePath);console.log('更新下载成功!');// 这里可以添加下载完成后的处理逻辑,如解压文件等} catch (error) {console.error('更新检查或下载失败:', error);// 可以在这里添加重试逻辑或通知用户}
}// 立即执行一次检查
checkAndDownloadUpdate();// 如果需要定时检查,可以取消下面的注释
// setInterval(checkAndDownloadUpdate, 60 * 60 * 1000); // 每小时检查一次

完整代码

const { app, BrowserWindow, Tray, Menu, nativeImage } = require('electron');
const path = require('path');
// 引入文件
const { start } = require(path.join(__dirname, 'electron/start.js'));
const { mysql } = require(path.join(__dirname, 'electron/mysql.js'));
const { setWin } = require(path.join(__dirname, 'electron/win.js'));
const { starts } = require(path.join(__dirname, 'electron/server.js'));
const { my } = require(path.join(__dirname, 'electron/my.js'));// 单实例检查,如何打开过一个了,不用打开多个
const getTheLock = app.requestSingleInstanceLock();
if (!getTheLock) {app.quit();return;
}else{app.on('second-instance', (event, commandLine, workingDirectory) => {if (!win || win.isDestroyed()) {createWindow();} else {if (win.isMinimized()) {win.restore();}win.show();win.focus();}});
}let win;
// 定义窗口关闭事件的回调函数,方便后续移除
const handleWindowClose = (e) => {// 点击关闭,隐藏所有窗口e.preventDefault();win.hide();
};
// 存放main.js的路径
let electronPage = __dirnamefunction createWindow() {win = new BrowserWindow({width: 400,height: 550,autoHideMenuBar: true, // 自动隐藏菜单resizable: false, // 禁止窗口调整大小title:"AI智能APP",webPreferences: {nodeIntegration: true,contextIsolation: false,enableRemoteModule: true},});// 生产环境加载打包后的index.htmlwin.loadFile(path.join(__dirname, 'dist/index.html'));// 访问服务,打包环境和开发环境都可以用// win.loadURL('http://127.0.0.1:8600/#/');// 监听窗口关闭事件,阻止默认关闭行为win.on('close', handleWindowClose);// 启动start(win,electronPage);// mysqlmysql(win,electronPage)// win窗口setWin()// 连接数据库my(win,electronPage)}const http = require('http');
const https = require('https');
const fs = require('fs');
const { URL } = require('url');
// 监听更新
function winUpdate(){// 每次执行完后重新设置定时器try {// 获取当前时间并格式化为易读的字符串// const now = new Date();// const timeString = now.toLocaleString();// console.log(`当前时间: ${timeString}`);// // 记录内存使用情况(可选)// const memoryUsage = process.memoryUsage();// console.log(`内存使用: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`);console.log('检测更新...');checkAndDownloadUpdate()}catch(error) {console.error('定时任务出错:', error);}finally {// 无论如何都继续下一次执行// setTimeout(winUpdate, 1000);}
} 
winUpdate()// 下载文件函数
function downloadFile(url, savePath) {return new Promise((resolve, reject) => {try {console.log(`开始下载: ${url}`);console.log(`保存路径: ${savePath}`);const parsedUrl = new URL(url);const protocol = parsedUrl.protocol === 'https:' ? https : http;// 创建保存目录(如果不存在)const saveDir = path.dirname(savePath);fs.mkdirSync(saveDir, { recursive: true });const fileStream = fs.createWriteStream(savePath);const request = protocol.get(url, (response) => {if (response.statusCode !== 200) {reject(new Error(`HTTP错误,状态码: ${response.statusCode}`));return;}const totalBytes = parseInt(response.headers['content-length'], 10) || 0;let receivedBytes = 0;response.on('data', (chunk) => {receivedBytes += chunk.length;const progress = totalBytes > 0 ? (receivedBytes / totalBytes) * 100 : 0;// console.log(`下载进度: ${progress.toFixed(2)}%`);});response.on('end', () => {fileStream.end();console.log('下载完成');resolve(savePath);});response.on('error', (error) => {console.error('响应流错误:', error);fileStream.destroy();reject(error);});// 将响应数据管道传输到文件流response.pipe(fileStream);});request.on('error', (error) => {console.error('请求错误:', error);fileStream.destroy();reject(error);});request.on('timeout', () => {console.error('请求超时');request.destroy();fileStream.destroy();reject(new Error('请求超时'));});// 设置超时时间(6分钟)request.setTimeout(360000);request.end();} catch (error) {console.error('下载过程中发生异常:', error);reject(error);}});}// 检查更新并下载
async function checkAndDownloadUpdate() {try {console.log('检测更新...');const updateUrl = "http://dade.dddxxxx.com/app/dade.zip";// 使用当前目录下的downloads文件夹作为保存位置const savePath = path.join(__dirname, '', 'dade.zip');await downloadFile(updateUrl, savePath);console.log('更新下载成功!');// 这里可以添加下载完成后的处理逻辑,如解压文件等} catch (error) {console.error('更新检查或下载失败:', error);// 可以在这里添加重试逻辑或通知用户}
}// 启动
let tray;
app.whenReady().then(() => {createWindow();// 加入右下角// const icon = nativeImage.createFromPath('images/log.png');const icon = nativeImage.createFromPath(path.join(__dirname, 'images/log.png'));tray = new Tray(icon);const contextMenu = Menu.buildFromTemplate([{label: '打开窗口',click: () => {if (!win || win.isDestroyed()) {createWindow();} else {win.show();win.focus();}}},{label: '退出应用',click: () => {if (win &&!win.isDestroyed()) {// 移除关闭事件监听器,避免阻止关闭win.removeListener('close', handleWindowClose);win.close();}app.quit();}}]);tray.setContextMenu(contextMenu);// 为托盘添加点击事件监听器tray.on('click', () => {if (!win || win.isDestroyed()) {createWindow();} else {win.show();win.focus();}});tray.setToolTip('沛基AI');tray.setTitle('沛基AI');// 其它console.log("启动啦");app.on('activate', function () {if (BrowserWindow.getAllWindows().length === 0) createWindow();});
});// 窗口关闭事件
app.on('window-all-closed', function () {console.log("关闭啊");// 直接关闭// if (process.platform!== 'darwin') app.quit();
});

相关文章:

electron下载文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下载文件函数 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(开始下载…...

Neo4j 数据导入:原理、技术、技巧与最佳实践

在构建知识图谱、社交网络分析或复杂关系系统时,高效准确地将数据导入Neo4j图数据库至关重要。本文基于官方文档,深入探讨Neo4j数据导入的核心原理、主流技术、实用技巧及行业最佳实践。 Neo4j的数据导入不仅是技术操作,更是图模型设计的延续。深入理解存储原理、灵活运用C…...

数论~~~

质数 质数Miller-Rabin算法质因子分解质数筛埃氏筛欧拉筛如果只是计数,埃氏筛改进 快速幂乘法快速幂矩阵快速幂1维k阶实战(提醒:最好在mul函数中作乘法时加上(long long)的强制类型转换 ,或者全部数组换成long long&am…...

web第十次课后作业--Mybatis的增删改查

(一)删除操作 功能:根据主键删除数据 SQL 语句 -- 删除id17的数据 delete from emp where id 17;Mybatis 框架让程序员更关注于 SQL 语句 接口方法 Mapper public interface EmpMapper {//Delete("delete from emp where id 17&qu…...

贪心算法应用:集合覆盖问题详解

贪心算法与集合覆盖问题详解 贪心算法在组合优化问题中展现出独特优势,集合覆盖问题(Set Cover Problem)是其中的经典案例。本文将用2万字全面解析贪心算法在集合覆盖/划分中的应用,涵盖算法原理、正确性分析、Java实现、复杂度证…...

BLOB 是用来存“二进制大文件”的字段类型

BLOB 是用来存“二进制大文件”的字段类型,可以存 0 到 65535 字节的数据,常用来存图片、音频、PDF、Word 等“非文本”内容。 BLOB 0-65535 bytes 二进制形式的长文本数据✅ 关键词 1:BLOB 全称:Binary Large Object中文&…...

5.Declare_Query_Checking.ipynb

这个教程 5.Declare_Query_Checking.ipynb 主要讲解了如何使用 DECLARE 查询检查器来分析事件日志中的约束关系。 1. 主要功能 这个教程展示了如何使用 DeclareQueryChecker 来: 发现事件日志中满足特定支持度的约束模式查询不同类型的约束关系分析活动之间的关联…...

【知识点】第7章:文件和数据格式化

文章目录 知识点整理文件概述文件的打开和关闭文件的读操作文件的写操作 练习题填空题选择题​​ 知识点整理 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象,类似地,函…...

NetSuite Bundle - Dashboard Refresh

儿童节快乐! 今朝发一个Bundle,解决一个NetSuite Dashboard的老问题。出于性能上的考虑,NetSuite的Dashboard中的Portlet,只能逐一手工刷新。有人基于浏览器做了插件,可以进行自动刷新。但是在我们做项目部署时&#…...

AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度

在工业自动化浪潮席卷全球的当下,仓储物流环节的效率与精准度成为企业降本增效的关键战场。其中,塑料袋拆垛作为高频、高重复性的作业场景,传统人工或机械臂操作面临着诸多挑战。迁移科技,作为行业领先的 3D 工业相机和 3D 视觉系…...

智慧赋能:移动充电桩的能源供给革命与便捷服务升级

在城市化进程加速与新能源汽车普及的双重推动下,移动充电桩正成为能源供给领域的一场革命。传统固定充电设施受限于布局与效率,难以满足用户即时、灵活的充电需求,而移动充电桩通过技术创新与服务升级,打破了时空壁垒,…...

【项目实践】SMBMS(Javaweb版)(三)登出、注册、注销、修改

文章目录 登出、注册、注销、修改登出操作的实现逻辑及方式防止用户登出后可以继续访问修改密码功能实现导入jsp实现Dao层数据接口实现Service层业务接口注册Servlet 注册和注销 用户的方式导入jsp实现Dao层的数据逻辑实现Service逻辑注册Servlet 登出、注册、注销、修改 登出…...

斐波那契数列------矩阵幂法

斐波那契数列 斐波拉楔数是我们在学递归的使用看到的题目,但递归法是比较慢的,后面我们用循环递进来写的,但今天我有遇到了新的方法—— 矩阵幂法(线性代数的知识点)。 矩阵幂法: F11*F10*F2; F20*F11*…...

【Go语言基础【四】】局部变量、全局变量、形式参数

文章目录 一、一句话总结二、作用域分类1. 局部变量(函数内/块内变量)1.1、语法说明1.2、示例 2. 全局变量(包级变量)2.1、语法说明2.2、示例:全局变量的访问 3. 形式参数(函数参数) 三、作用域…...

DeepSeek 赋能车路协同:智能交通的破局与重构

目录 一、引言二、智能交通车路协同系统概述2.1 系统定义与原理2.2 系统构成2.3 发展现状与挑战 三、DeepSeek 技术剖析3.1 DeepSeek 简介3.2 核心技术原理3.2.1 Transformer 架构3.2.2 混合专家架构(MoE)3.2.3 多头潜在注意力(MLA&#xff0…...

RabbitMQ 的异步化、解耦和流量削峰三大核心机制

RabbitMQ 的异步化、解耦和流量削峰三大核心机制 RabbitMQ 是解决数据库高并发问题的利器,通过异步化、解耦和流量削峰三大核心机制保护数据库。下面从设计思想到具体实现,深入剖析 RabbitMQ 应对高并发的完整方案: 一、数据库高并发核心痛点…...

Ubuntu 25.10 将默认使用 sudo-rs

非盈利组织 Trifecta Tech Foundation 报告,Ubuntu 25.10 将默认使用它开发的 sudo-rs——用内存安全语言 Rust 开发的 sudo 实现。 Ubuntu 25.10 代号 Questing Quokka,预计将于 2025 年 10 月释出,是一个短期支持版本。Sudo-rs 是 Trifect…...

Maven​​ 和 ​​Gradle​​ 依赖管理的详细说明及示例,涵盖核心概念、配置方法、常见问题解决和工具对比。

一、Maven 依赖管理 1. 核心概念 ​​依赖声明​​&#xff1a;在 pom.xml 中通过 <dependency> 标签定义依赖项&#xff0c;包含 groupId、artifactId、version。​​仓库​​&#xff1a;依赖下载的来源&#xff0c;包括中央仓库&#xff08;Maven Central&#xff0…...

【Web应用】若依框架:基础篇21二次开发-页面调整

文章目录 ⭐前言⭐一、课程讲解⭐二、怎样选择设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐三、怎样使用设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内…...

【 java 基础知识 第一篇 】

目录 1.概念 1.1.java的特定有哪些&#xff1f; 1.2.java有哪些优势哪些劣势&#xff1f; 1.3.java为什么可以跨平台&#xff1f; 1.4JVM,JDK,JRE它们有什么区别&#xff1f; 1.5.编译型语言与解释型语言的区别&#xff1f; 2.数据类型 2.1.long与int类型可以互转吗&…...

CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)

漏洞概述 漏洞名称&#xff1a;Apache Flink REST API 任意文件上传漏洞 漏洞编号&#xff1a;CVE-2020-17518 CVSS 评分&#xff1a;7.5 影响版本&#xff1a;Apache Flink 1.5.1 - 1.11.2 修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0 漏洞类型&#xff1a;路径遍历导致的任…...

Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰

使用 CyberWin Excel Downloader 进行 Excel 表格及各种文档的批量下载&#xff0c;优势显著。它能大幅节省时间&#xff0c;一次性获取大量所需文档&#xff0c;无需逐个手动下载&#xff0c;提升工作效率。可确保数据完整性与准确性&#xff0c;避免因重复操作产生失误。还便…...

可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案

这份文档是一份关于新能源智能汽车应用解决方案的详细资料&#xff0c;它深入探讨了智能汽车行业的发展趋势&#xff0c;指出汽车正从单纯交通工具转变为网络入口和智能设备&#xff0c;强调了车联网、自动驾驶、智能娱乐等技术的重要性。文档提出了一个基于大数据中台的车企数…...

【统计方法】基础分类器: logistic, knn, svm, lda

均方误差&#xff08;MSE&#xff09;理解与分解 在监督学习中&#xff0c;均方误差衡量的是预测值与实际值之间的平均平方差&#xff1a; MSE E [ ( Y − f ^ ( X ) ) 2 ] \text{MSE} \mathbb{E}[(Y - \hat{f}(X))^2] MSEE[(Y−f^​(X))2] MSE 可以分解为三部分&#xff1…...

AtomicInteger原子变量和例题

目录 AtomicInteger源代码加1操作解决ABA问题的AtomicStampedReference 按顺序打印方法 AtomicInteger源代码 // java.util.concurrent.atomic.AtomicIntegerpublic class AtomicInteger extends Number implements java.io.Serializable {private static final long serialVe…...

simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?

提问 simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出&#xff1f; 回答 Simulink 本身没有一个单独的模块能够直接将三个分开的输入合并成一个 [13] 行向量输出&#xff0c;但是可以通过 组合模块实现你要的效果。 ✅ 推荐方式&#xff1a;Mux …...

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了&#xff0c;退回Rocky8麻烦机器都建好了&#xff0c;决定手动安装k8s&#xff0c;结果手动安装过程中遇到各种坑&#xff0c;这里记录下&#xff1b; k8s安装 k8s具体安装过程可自行搜索&#xff0c;或者deepseek; 也…...

Selenium 和playwright 使用场景优缺点对比

1. 核心对比概览 特性SeleniumPlaywright诞生时间2004年&#xff08;历史悠久&#xff09;2020年&#xff08;微软开发&#xff0c;现代架构&#xff09;浏览器支持所有主流浏览器&#xff08;需驱动&#xff09;Chromium、Firefox、WebKit&#xff08;内置引擎&#xff09;执…...

从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; 是一种由 Anthropic 公司于 2024 年 11 月推出的开源通信协议&#xff0c;旨在标准化大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具之间的交互。 它通过定义统一的接口和通信规则…...

Python训练营打卡Day43

kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 config.py import os# 基础配置类 class Config:def __init__(self):# Kaggle配置self.kaggle_username "" # Kaggle用户名self.kaggle_key &quo…...