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

electron打包后主进程下载文件崩溃

electron+vue3写了一个小项目,实现了一个文件下载功能

存在的问题

	打包后,应用下载文件崩溃

代码

// 渲染进程window.electron.ipcRenderer.invoke('save-file', {'path': r.filePath,'fileurl': previewUrl,}).then(response => {console.log('response --------------');console.log(response);})// 主进程
ipcMain.handle('save-file', (event, args) => {// process.crash()try {// 下载保存文件console.log('axios args.fileurl ------------');console.log(args.fileurl);return downloadFile(args.fileurl, args.path)} catch (error) {console.log('error ---------------------------')console.log(error)return 'save-file 出错了: \n' + error.toString()}
});// 工具文件
import axios from 'axios'
import fs from 'fs/promises'export function downloadFile(downloadUrl, downloadPath) {try {return axios.get(downloadUrl, {method: 'GET',headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36","Referer": downloadUrl,},responseType: 'arraybuffer'}).then(res => {console.log('下载成功')return fs.writeFile(downloadPath, res.data, "binary").then(r => {console.log('保存成功')return fs.stat(downloadPath)});}).catch(e => {console.log('e ------------------')console.log(e)return e});} catch (error) {console.log('error ---------------------------')console.log(error)return 'downloadFile 出错了: \n' + error.toString()}
}

解决思路

首先,要复现,我测试了自己的笔记本电脑,双系统都没问题,没办法复现这个bug,但是测试那边两台电脑都能复现,测试是在外地!我只好又找了一台闲置电脑,还好复现出来了,否则只能回家试试自己的电脑了

第二,找到问题所在,打包后 console.log 就看不到了,我想办法记录日志,看了官方的crashReporter,还有不少人推荐,我正好全栈,就搞了个接口接收日志,但是没有任何报错。后来试了electron-log,记录在用户本地,真香,简单好用,以后有需要直接搞个接口上传log文件就好了!还是没报错!但是我锁定了有问题的那一行代码,就是 axios.get(downloadUrl, { 这里崩溃的!

第三,想办法换掉axios!试了第三方electron下载库,electron-download、electron-dl、都很难用,文档少,搜索结果更少,自己摸索半天也没跑起来,继续换electron-download-manage,但是这个东西调用很麻烦!换request下载,和axios比较像,还是不行!我觉得我的方向可能错了,灵机一动,把axios下载放在渲染进程里面,下载好的数据传递给主进程!好了!

代码

// 渲染进程axios.get(previewUrl, {method: 'GET',responseType: 'arraybuffer'}).then(res => {console.log('下载成功')console.log('下载成功')console.log('下载成功')console.log(typeof res.data)window.electron.ipcRenderer.invoke('save-file', {'data': res.data,'path': r.filePath,}).then(response => {console.log('response --------------');console.log(response);})// 主进程ipcMain.handle('save-file', (event, args) => {try {log.info('event, args ------------');log.info(event, args);// 保存文件return saveFile(args.data, args.path)} catch (error) {log.info('error ---------------------------')log.info(error)return 'save-file 出错了: \n' + error.toString()}
});// 工具js
import fs from 'fs/promises'
import log from 'electron-log'
import { Buffer } from 'buffer'export function saveFile(data, downloadPath) {log.info('saveFile ----------------------- 0')try {log.info('saveFile ----------------------- 1')return fs.writeFile(downloadPath, Buffer.from(data), "binary").then(r => {log.info('保存成功')return fs.stat(downloadPath)});} catch (error) {log.info('saveFile ----------------------- 3')log.info('error ---------------------------')log.info(error)throw new Error('saveFile出错了:' + error.toString()) // 将错误包装成新的Error对象并抛出,让调用者知道发生了错误}
}

中间还发生了一个小插曲

Error occurred in handler for 'save-file': 
TypeError [ERR_INVALID_ARG_TYPE]: 
The "data" argument must be of type string or an instance of 
Buffer, TypedArray, or DataView. Received an instance of ArrayBuffer

所以才有了Buffer.from(data)
感谢文心一言,感谢我自己!

相关文章:

electron打包后主进程下载文件崩溃

electronvue3写了一个小项目,实现了一个文件下载功能 存在的问题 打包后,应用下载文件崩溃代码 // 渲染进程window.electron.ipcRenderer.invoke(save-file, {path: r.filePath,fileurl: previewUrl,}).then(response > {console.log(response ----…...

Spring实例化源码解析之Custom Events下集(九)

上集从官网的角度讲解了基本的使用和源码的内容,没有深入的进行分析,本章将从源码的角度分析ApplicationEvent、ApplicationListener、ApplicationEventMulticaster这三者之间的关系。 initApplicationEventMulticaster 上一章后续部分给出了源码的含义…...

python numpy库关键函数说明

python numpy库函数说明 np.argwhere()np.dtype()np.shape()np.zeros() np.argwhere() 输入参数是一个基本的逻辑表达式,输出检索结果的索引值。 >>> x np.arange(6).reshape(2,3) >>> x array([[0, 1, 2],[3, 4, 5]]) >>> np.argwhe…...

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间,即程序如何分…...

IP协议总结

一、定义。 IP全称为Internet Protocol,是TCP/IP协议族中的一员,负责实现数据在网络上的传输。它是一种无连接、不可靠的数据报协议。 IP协议常用于Internet网络和局域网中,它通过将数据包进行分组并进行逐跳转发来实现数据在网络中的传输。…...

微信支付v2

文档: https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序,,还需要一个,在微信商户平台,&…...

tcpdump(二)命令行参数讲解(一)

一 tcpdump实战详解 1、我们做抓包,一般都需要指定条件,保证对系统的CPU、内存、磁盘资源不会产生过大的响应备注: 遇到过tcpdump持续抓包导致系统挂了2、条件:1) tcpdump的 基础命令选项参数2) 真正的 过滤条件 抓包工具tcpdump用法说明 ① 参数学…...

10_8C++

X-Mind #include <iostream>using namespace std; class Rect { private:int width;int heigjt; public:void init(int w,int h){width w;heigjt h;}void set_w(int w){width w;}void set_h(int h){heigjt h;}void show(){cout << "矩形的周长" <…...

JVM篇---第七篇

系列文章目录 文章目录 系列文章目录一、Minor GC与Full GC分别在什么时候发生?二、你知道哪些JVM性能调优参数?(简单版回答)三、对象一定分配在堆中吗?有没有了解逃逸分析技术?一、Minor GC与Full GC分别在什么时候发生? 新生代内存不够用时候发生MGC也叫YGC,JVM内存…...

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多&#xff0c;以下方法不一定都适用&#xff0c;我是通过以下方法解决的 打开命令终端输入以下命令&#xff0c;可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches...

winform窗体控件太多显示不过来,怎么实现滚动条

winform窗体控件太多显示不过来&#xff0c;怎么实现滚动条 Winform Panel实现滚动条 一、创建panel 在界面上拖拽一个父级Panel1&#xff0c;然后在Panel1里面拖拽一个子级Panel2 设置父级Panel1的AutoScroll属性为True 属性设置好后&#xff0c;当子级高度或者宽度大于父…...

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时&#xff0c;在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…...

Spring中shutdown hook作用

在Spring框架中&#xff0c;Shutdown Hook&#xff08;关闭钩子&#xff09;是一种机制&#xff0c;用于在应用程序关闭时执行一些清理操作Spring会向JVM注册一个shutdown hook&#xff0c;在接收到关闭通知的时候&#xff0c;进行bean的销毁&#xff0c;容器的销毁处理等操作在…...

关于IvorySQL和OpenGauss包SPEC处理的一些思考

包的SPEC区可以定义下面三种类型&#xff08;本篇只讨论SPEC区的情况&#xff09; 变量类型&#xff08;nested table等&#xff09;&#xff08;注意这是包内定义的类型&#xff0c;与SQL创建的不通&#xff09;游标 这三种类型在PG原生中&#xff0c;是找不到相似的功能的&…...

我用PYQT5做的第一个实用的上位机项目(六)

将之前的画面和代码用复制粘贴的方法复制四份&#xff0c;就完成了整个主画面和主程序的基本构建。 下面的工作是关于PLC和通信。 上位机项目&#xff0c;其与PLC通信的模式很多都是这样的&#xff1a;在没有操作和设置的平常显示界面&#xff0c;按照预定周期从PLC读取当前页…...

【高级语言程序设计】python函数式编程(一)

基础知识 Python函数式编程的主要内容包括以下几个方面&#xff1a; (1)函数作为一等公民&#xff1a;在函数式编程中&#xff0c;函数被视为一等公民&#xff0c;可以像其他数据类型一样被传递、赋值以及作为返回值。 (2)不可变数据&#xff1a;函数式编程鼓励使用不可变数据…...

使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件

文件夹目录如下&#xff08;需要递归删除文件夹下的.DS_Store文件&#xff09;&#xff1a; labels文件夹下面是xml文件&#xff1a; import os import os.pathpath "name/labels" files os.listdir(path) # 得到文件夹下所有文件名称 s []for xmlFile in files:…...

flutter实现透明appbar(一)

前言 在项目中如何实现透明的appbar&#xff0c;方式一&#xff1a; 使用stack和positioned定位功能把appbar定位到页面的最上面&#xff0c; 实现 实现 Widget build(BuildContext context) {return Scaffold(body: Stack(children: [_homePage(), _appBar()],),);}_appbar…...

(四)正点原子STM32MP135移植——u-boot移植

一、概述 u-boot概述就不概述了&#xff0c;u-boot、kernel、dtb三件套&#xff0c;dddd 经过国庆艰苦奋战&#xff0c;已经成功把所有功能移植好了 二、编译官方代码 进入u-boot的目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf u-boot-stm32mp-v2022.10-stm32mp-r1-r0.…...

[计算机入门] 应用软件(办公类)

3.19 应用软件(办公类) 3.19.1 Microsoft office办公软件套件 Microsoft Office 是一套广泛使用的办公软件套件&#xff0c;由Microsoft公司开发和发布。它包含了多个应用程序&#xff0c;用于处理各种办公任务。以下是Office常见的几个应用程序&#xff1a; Microsoft Word…...

告别激光雷达?手把手教你用CRN低成本实现BEV 3D感知(附PyTorch代码)

低成本BEV 3D感知实战&#xff1a;用CRN实现相机-雷达融合&#xff08;附完整PyTorch代码&#xff09; 在自动驾驶和机器人领域&#xff0c;3D环境感知一直是核心技术瓶颈。传统激光雷达方案虽精度高&#xff0c;但成本动辄数万元&#xff0c;且受天气影响显著。我们团队经过半…...

GG3M 元模型完整详解:从东方哲学数学化到文明级智慧操作系统

GG3M 元模型完整详解&#xff1a;从东方哲学数学化到文明级智慧操作系统摘要&#xff1a; GG3M 是全球首个以贾子理论&#xff08;Kucius Theory&#xff09;为核心、定位文明级智慧操作系统的 AGI 项目。其元模型&#xff08;Meta-Model&#xff09;以 3M 三层架构&#xff08…...

Zotero插件生态:从翻译到效率提升的进阶配置指南

1. Zotero插件生态全景&#xff1a;从翻译到全流程优化 第一次接触Zotero时&#xff0c;我和大多数人一样&#xff0c;只是把它当作一个简单的文献管理工具。直到某天深夜赶论文&#xff0c;连续手动整理了47篇参考文献后&#xff0c;手指酸痛的我突然意识到&#xff1a;这绝对…...

别再死记硬背了!用矢量网络分析仪实测PA的P1dB和OIP3(附详细步骤与曲线解读)

矢量网络分析仪实战&#xff1a;PA的P1dB与OIP3测量全流程解析 在射频放大器设计与测试领域&#xff0c;P1dB和OIP3是两个无法绕开的性能指标。许多工程师虽然能背诵定义&#xff0c;但面对实验室里的矢量网络分析仪&#xff08;VNA&#xff09;时却无从下手。本文将彻底改变这…...

M5Stack舵机驱动库:PCA9685硬件PWM控制与多平台移植

1. 项目概述M5Hat-8Servos 是专为 M5Stack 生态设计的硬件驱动库&#xff0c;用于控制 M5Stack 官方推出的HAT-8SERVO扩展模块。该模块基于PCA9685 16通道12位PWM LED与伺服驱动芯片&#xff0c;通过 IC 总线与主控&#xff08;如 M5Stack Core2、M5Stamp C3、M5Paper 等&#…...

如何用AI在3分钟内自动生成专业视频:告别复杂剪辑的全新解决方案

如何用AI在3分钟内自动生成专业视频&#xff1a;告别复杂剪辑的全新解决方案 【免费下载链接】auto-video-generateor 自动视频生成器&#xff0c;给定主题&#xff0c;自动生成解说视频。用户输入主题文字&#xff0c;系统调用大语言模型生成故事或解说的文字&#xff0c;然后…...

5个秘诀:如何快速生成专业艺术二维码的完整指南

5个秘诀&#xff1a;如何快速生成专业艺术二维码的完整指南 【免费下载链接】amazing-qr &#x1f4ae; amazing QRCode generator in Python (supporting animated gif) - Python amazing 二维码生成器&#xff08;支持 gif 动态图片二维码&#xff09; 项目地址: https://g…...

如何从零开始掌握Metasploitable3?安全测试入门到实践指南

如何从零开始掌握Metasploitable3&#xff1f;安全测试入门到实践指南 【免费下载链接】metasploitable3 Metasploitable3 is a VM that is built from the ground up with a large amount of security vulnerabilities. 项目地址: https://gitcode.com/gh_mirrors/me/metasp…...

FireRed-OCR StudioGPU适配方案:多卡并行解析长文档的配置详解

FireRed-OCR StudioGPU适配方案&#xff1a;多卡并行解析长文档的配置详解 1. 工业级文档解析工具概述 FireRed-OCR Studio是一款基于Qwen3-VL模型开发的下一代文档解析工具&#xff0c;专为处理复杂文档场景设计。它不仅能够精准识别文字内容&#xff0c;更能完整还原文档中…...

深度解析Wiki.js操作日志系统:构建企业级安全监控的完整方案

深度解析Wiki.js操作日志系统&#xff1a;构建企业级安全监控的完整方案 【免费下载链接】wiki- Wiki.js | A modern and powerful wiki app built on Node.js 项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki- 当团队协作编辑Wiki内容时&#xff0c;你是否…...