Electron下载生成的小程序二维码图片(非浏览器a标签下载)

javascript 复制代码
const generateMiniProgramQR = async (
    params: { scene: any; page?: any; width?: number; label?: any },
    ACCESS_TOKEN: any,
    label: any
) => {
    try {
        const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${ACCESS_TOKEN}`
        
        // 渲染进程
        // const { ipcRenderer } = require('electron')

        const downloadFile = async (
            url: string,
            params: { scene: any; page?: any; width?: number | undefined; label?: any },
            filename: string
        ) => {
            try {
                const response = await axios.post(url, params, { responseType: 'arraybuffer' })
                //     //  将二进制数据通过IPC发送到主进程
                //     ipcRenderer.send('silent-download', {
                //         buffer: Buffer.from(response.data),
                //         filename: `${filename}.jpg`,
                //     })

                // 关键:转换为 Uint8Array 而非 Buffer
                const buffer = new Uint8Array(response.data)

                // 通过预加载接口发送
                window.electronAPI.downloadFile(buffer, `${filename}.jpg`)

                // 监听结果(可选)
                window.electronAPI.onDownloadResult(({ success, path, error }) => {
                    if (success) console.log('文件保存至:', path)
                    else console.error('保存失败:', error)
                })
            } catch (error) {
                console.error('下载请求失败:', error)
            }
        }
        downloadFile(url, params, label)
    } catch (error) {
        // 错误处理
        console.error('下载失败:', error)
    }
}

注意

这里用require不行,主线程默认开启contextIsolation,不允许node方式引入

javascript 复制代码
const { ipcRenderer } = require('electron')

主线程main.ts,每次修改文件,项目会自动重启

javascript 复制代码
import { app, BrowserWindow, dialog, ipcMain, shell } from 'electron'
import path from 'node:path'
import fs from 'fs'
ipcMain.on('silent-download', (event, { buffer, filename }) => {
    try {
        const downloadsPath = app.getPath('desktop'); 
        // 改为系统下载目录:app.getPath('downloads')
        const filePath = path.join(downloadsPath, filename);

        // 将 Uint8Array 转换为 Node.js Buffer
        const nodeBuffer = Buffer.from(buffer);
        fs.writeFile(filePath, nodeBuffer, (err) => {
            if (err) {
                event.sender.send('download-result', { success: false, error: err.message });
            } else {
                event.sender.send('download-result', { success: true, path: filePath });
            }
        });
    } catch (error: any) {
        event.sender.send('download-result', { success: false, error: error.message });
    }
});

preload.ts

javascript 复制代码
import { ipcRenderer, contextBridge } from 'electron'

contextBridge.exposeInMainWorld('electronAPI', {
  downloadFile: (buffer: any, filename: any) => {
    // 验证数据类型
    if (!(buffer instanceof Uint8Array)) {
      throw new Error('必须传递 Uint8Array 类型数据');
    }
    ipcRenderer.send('silent-download', { buffer, filename });
  },
  // 可选:接收主进程反馈
  onDownloadResult: (callback: (arg0: any) => void) => {
    ipcRenderer.on('download-result', (_event, result) => callback(result));
  }
});

electron-env.d.ts

javascript 复制代码
interface IElectronAPI {
  // 声明预加载脚本暴露的方法签名
  downloadFile: (buffer: any, filename: string) => void;
  onDownloadResult: (callback: (arg0: any) => void) => void
  // 其他方法...
}

// Used in Renderer process, expose in `preload.ts`
interface Window {
  ipcRenderer: import('electron').IpcRenderer,
  electronAPI: IElectronAPI;
}
相关推荐
Nan_Shu_61415 分钟前
学习: Threejs (2)
前端·javascript·学习
G_G#23 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界38 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
Amumu121381 小时前
React面向组件编程
开发语言·前端·javascript
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript
说私域2 小时前
短视频私域流量池的变现路径创新:基于AI智能名片链动2+1模式S2B2C商城小程序的实践研究
大数据·人工智能·小程序
拖拉斯旋风3 小时前
从零开始:使用 Ollama 在本地部署开源大模型并集成到 React 应用
前端·javascript·ollama
德育处主任3 小时前
『NAS』在群晖部署图片压缩工具-Squoosh
前端·javascript·docker
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于微信小程序的松辽律所咨询系统的设计与实现为例,包含答辩的问题和答案
微信小程序·小程序
Van_captain4 小时前
rn_for_openharmony常用组件_Breadcrumb面包屑
javascript·开源·harmonyos