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();
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85642.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速掌握 GO 之 RabbitMQ 結合 gin+gorm 案例

更多個人筆記見: (注意點擊“繼續”,而不是“發現新項目”) github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習,學習過程中還會不斷補充&…

android FragmentManager 刪除所有Fragment 重建

在Android開發中,管理Fragment是一項常見任務,有時需要刪除所有Fragment并重新創建。這在某些場景下,例如用戶需要重置應用狀態或切換內容時,顯得尤為重要。本文將詳細介紹如何通過 FragmentManager刪除所有Fragment并重建。 一、…

ubuntu之開機自啟frpc

在 Ubuntu 系統中為 frpc 設置開機自啟(以 frpc -c frpc.toml 命令為例),可以通過 systemd 服務實現。以下是詳細步驟: 創建 systemd 服務文件 sudo vim /etc/systemd/system/frpc.service 寫入以下內容(根據你的路…

推薦一款PDF壓縮的工具

今天一位小伙伴找來,問我有沒有辦法將PDF變小的辦法。 詳細了解了一下使用場景: 小伙伴要在某系統上傳一個PDF文件,原文件是11.6MB,但是上傳時系統做了限制,只能上傳小于10MB的文件,如圖: 我聽…

JDK21深度解密 Day 11:云原生環境中的JDK21應用

【JDK21深度解密 Day 111】云原生環境中的JDK21應用 本文是《JDK21深度解密:從新特性到生產實踐的全棧指南》專欄的第11天內容,聚焦云原生環境中的JDK21應用。我們將深入探討如何在容器化、微服務、Serverless等云原生架構中充分發揮JDK21的技術優勢,提升Java應用的性能、穩…

Java-redis實現限時在線秒殺功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql數據庫表設…

QT- QML Layout+anchors 布局+錨點實現窗口部件權重比例分配

布局管理 簡單比較兩種界面管理錨點布局實現比例布局布局管理實現比例布局循環依賴問題簡談 在日常打螺絲中&#xff0c;我們偶爾會需要實現界面各組件能按比例放置&#xff0c;自適應各種分辨率的需求。我用錨點和布局都實現過相關界面&#xff0c;記錄下來兩種方式實現的差異…

Java項目OOM排查

排查思路 Java項目出現OOM&#xff08;Out Of Memory&#xff0c;內存溢出&#xff09;問題時&#xff0c;排查思路如下&#xff1a; 確認OOM類型&#xff1a; Java Heap Space&#xff1a;堆內存溢出&#xff0c;通常是對象創建過多或內存泄漏。PermGen Space&#xff1a;永久…

vue+threeJs 生成云狀特效屏幕

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJs 生成云狀特效屏幕”。 動態云狀特效示例圖 二、實例代碼 <!--創建一個動態數字屏幕--> <template><div class"pageBox"><div class"leftBox" ref"lef…

ABAP設計模式之---“高內聚,低耦合(High Cohesion Low Coupling)”

“高內聚、低耦合”是面向對象編程中非常重要的設計原則&#xff0c;它有助于提高代碼的可維護性、擴展性和復用性。 1. 初衷&#xff1a;為什么會有這個原則&#xff1f; 在軟件開發中&#xff0c;隨著業務需求的復雜化&#xff0c;代碼難免會變得越來越龐大。如果開發者將一…

Registry和docker有什么關系?

當遇到多個服務器需要同時傳docker鏡像的時候&#xff0c;一個一個的傳效率會非常慢且壓力完全在發送方的網絡帶寬&#xff1b;可以參考git hub&#xff0c;通常我們會用git push將代碼傳到git hub&#xff0c;如果誰需要代碼用git pull就可以拉到自己的機器上&#xff0c;dock…

linux命令 systemctl 和 supervisord 區別及用法解讀

目錄 基礎與背景服務管理范圍配置文件和管理方式監控與日志依賴管理適用場景常用命令對照表實際應用場景舉例優缺點對比小結參考鏈接 1. 基礎與背景 systemctl 和 supervisord 都是用于管理和控制服務&#xff08;進程&#xff09;的工具&#xff0c;但它們在設計、使用場景和…

(11)java+ selenium->元素定位之By_tag_name

1.簡介 繼續WebDriver關于元素定位,這篇介紹By ClassName。tagName是DOM結構的一部分,其中頁面上的每個元素都是通過輸入標簽,按鈕標簽或錨定標簽等標簽定義的。每個標簽都具有多個屬性,例如ID,名稱,值類等。就其他定位符而言在Selenium中,我們使用了標簽的這些屬性值來…

2021 RoboCom 世界機器人開發者大賽-高職組(復賽)解題報告 | 珂學家

前言 題解 2021 RoboCom 世界機器人開發者大賽-高職組&#xff08;復賽&#xff09;解題報告。 模擬題為主&#xff0c;包含進制轉換等等。 最后一題&#xff0c;是對向量/自定義類型&#xff0c;重定義小于操作符。 7-1 人工智能打招呼 分值: 15分 考察點: 分支判定&…

day42 簡單CNN

目錄 一、從圖像分類任務談起 二、CNN架構解剖實驗室 2.1 卷積層&#xff1a;空間特征的魔法師 2.2 歸一化層&#xff1a;加速收斂的隱形推手 2.3 激活函數&#xff1a;非線性的靈魂 三、工程實踐避坑指南 3.1 數據增強工程 3.2 調度器工程實戰 四、典型問題排查手冊 …

Gitee Wiki:以知識管理賦能 DevSecOps,推動關鍵領域軟件自主演進

關鍵領域軟件研發中的知識管理困境 傳統文檔管理模式問題顯著 關鍵領域軟件研發領域&#xff0c;傳統文檔管理模式問題顯著&#xff1a;文檔存儲無系統&#xff0c;查找困難&#xff0c;降低效率&#xff1b;更新不及時&#xff0c;與實際脫節&#xff0c;誤導開發&#xff1…

清理 pycharm 無效解釋器

1. 起因&#xff0c; 目的: 經常使用 pycharm 來調試深度學習項目&#xff0c;每次新建虛擬環境&#xff0c;都是顯示一堆不存在的名稱&#xff0c;刪也刪不掉。 總覺得很煩&#xff0c;是個痛點。決定深入研究一下。 2. 先看效果 效果是能行&#xff0c;而且清爽多了。 3. …

【ConvLSTM第二期】模擬視頻幀的時序建模(Python代碼實現)

目錄 1 準備工作&#xff1a;python庫包安裝1.1 安裝必要庫 案例說明&#xff1a;模擬視頻幀的時序建模ConvLSTM概述損失函數說明&#xff08;python全代碼&#xff09; 參考 ConvLSTM的原理說明可參見另一博客-【ConvLSTM第一期】ConvLSTM原理。 1 準備工作&#xff1a;pytho…

MySQL DDL操作全解析:從入門到精通,包含索引視圖分區表等全操作解析

目錄 一、DDL 基礎概述 1.1 DDL 定義與作用 1.2 DDL 語句分類 1.3 數據類型與存儲引擎 1.3.1 數據類型 1.3.2 存儲引擎差異 二、基礎 DDL 語句詳解 2.1 創建數據庫與表 2.1.1 創建數據庫 2.1.2 創建表 2.2 修改表結構 2.2.1 添加列 2.2.2 修改列屬性 2.2.3 刪除列…

設計模式——抽象工廠設計模式(創建型)

摘要 抽象工廠設計模式是一種創建型設計模式&#xff0c;旨在提供一個接口&#xff0c;用于創建一系列相關或依賴的對象&#xff0c;無需指定具體類。它通過抽象工廠、具體工廠、抽象產品和具體產品等組件構建&#xff0c;相比工廠方法模式&#xff0c;能創建一個產品族。該模…