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);
	});
})
相关推荐
小蜜蜂嗡嗡3 小时前
【flutter对屏幕底部有手势区域(如:一条横杠)导致出现重叠遮挡】
前端·javascript·flutter
伍哥的传说4 小时前
Vue 3 useModel vs defineModel:选择正确的双向绑定方案
前端·javascript·vue.js·definemodel对比·usemodel教程·vue3.4新特性·vue双向绑定
胡gh9 小时前
页面卡成PPT?重排重绘惹的祸!依旧性能优化
前端·javascript·面试
胡gh9 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
言兴9 小时前
# 深度解析 ECharts:从零到一构建企业级数据可视化看板
前端·javascript·面试
烛阴10 小时前
TypeScript 的“读心术”:让类型在代码中“流动”起来
前端·javascript·typescript
杨荧10 小时前
基于Python的农作物病虫害防治网站 Python+Django+Vue.js
大数据·前端·vue.js·爬虫·python
silent_missile12 小时前
element-plus穿梭框transfer的调整
前端·javascript·vue.js
山有木兮木有枝_13 小时前
node文章生成器
javascript·node.js
yes or ok14 小时前
前端工程师面试题-vue
前端·javascript·vue.js