vue2使用electron-builder打包-使用electron的api实现文件下载

本项目用的是vue2版本开发,最后使用electron-builder打包成桌面应用程序

一、需求描述

1、用户点击按钮,下载html文件

2、代码

复制代码
exportHtml() {
//.html是放在public文件夹下面的本地文件
      axios.get("/html/合同模板.html").then(res => {
        let a = document.createElement("a");
        let url = window.URL.createObjectURL(
          new Blob([res.data], {
            type: "text/html;charset='utf-8'" //这里指定的type对于桌面应用程序不生效,对浏览器有用
          })
        );
        a.href = url;
        a.download = "合同模板.html";
        a.click();
        window.URL.revokeObjectURL(url);
      });
    },
  • 浏览器下载

  • 桌面应用程序下载

    二、优化需求:保存类型为.html类型,弹窗的标题改为"另存为"

    大概思路介绍: 点击下载按钮时在vue页面使用dialog弹窗,自定义title和文件类型,保存时,在vue页面使用electronipcRenderer与主进程(background.js)通信,将下载文件的数据信息传过去,在主进程中保存文件。

1、 安装electron: npm install -s electron (本项目使用11的版本)"electron": "^11.5.0"

2、在background.js中配置

复制代码
 async function createWindow() {
  win = new BrowserWindow({
    width: 1200,
    height: 800,
    icon:path.join(__dirname,'favicon.ico'),
    webPreferences: {
      nodeIntegration:true,// process.env.ELECTRON_NODE_INTEGRATION,
      contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
      enableRemoteModule:true  //启用Remote模块
    },
   
  })

3、vue中引入(main.js)

复制代码
//electron需要打开,如果只是单纯的运行vue项目浏览器会报错
const electron = window.require('electron')
const remote = window.require("electron").remote
Vue.prototype.$electron = electron
Vue.prototype.$remote = remote

4、在需要导出文件的.vue页面使用

复制代码
exportHtml() {
      axios.get("/html/合同模板.html").then(res => {
         let url = window.URL.createObjectURL(
          new Blob([res.data], {
            type: "text/html"
          })
        );
        //使用remote模块的dialog
       this.$remote.dialog.showSaveDialog(
        {
          title: "另存为",
          filters: [
            { name: ".html", extensions: [".html"] } //另存为的数据类型
          ],
          defaultPath: `${this.fileName}.html`  //这个是文件名称,后面必须要加上.html后缀
        }).then(res=>{
		  	//变量值
           const obj = {
            url: url,
            filePath: res.filePath 
           }
           this.$electron.ipcRenderer.send('sendFile',JSON.stringify(obj))  
         }).catch((err)=>{
          console.log("err",err)
        })
       
      });
    },

5、在background.js页面接收

复制代码
import {  ipcMain } from 'electron'
ipcMain.on('sendFile',(event,arg)=>{
  const data = JSON.parse(arg)
  if(data.filePath){
    win.webContents.downloadURL(data.url); 
  }
  win.webContents.session.once('will-download', (event, item, webContents) => {
    if (!data.filePath) return;
    //设置下载项的保存文件路径
    item.setSavePath(data.filePath);
	});
})
相关推荐
华仔啊1 小时前
Vue 组件通信的 8 种最佳实践,你知道几种?
前端·vue.js
POLITE31 小时前
Leetcode 234.回文链表 JavaScript (Day 9)
javascript·leetcode·链表
Ahtacca1 小时前
Linux环境下前后端分离项目(Spring Boot + Vue)手动部署全流程指南
linux·运维·服务器·vue.js·spring boot·笔记
老前端的功夫2 小时前
TypeScript 全局类型声明:declare关键字的深度解析与实战
linux·前端·javascript·ubuntu·typescript·前端框架
EndingCoder2 小时前
TypeScript 入门:理解其本质与价值
前端·javascript·ubuntu·typescript·node.js
2501_946244783 小时前
Flutter & OpenHarmony OA系统弹窗对话框组件开发指南
javascript·flutter·microsoft
烟袅3 小时前
从定时器管理出发,彻底搞懂防抖与节流的实现逻辑
前端·javascript
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue小区人脸识别门禁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
前端小L3 小时前
贪心算法专题(十三):画地为牢的艺术——「划分字母区间」
javascript·算法·贪心算法
北冥有一鲲3 小时前
A2A协议与LangChain.js实战:构建微型软件工厂
开发语言·javascript·langchain