首页 > 编程语言 >Electron - #005 后端node调用文件打开对话框获取绝对路径传递给前端

Electron - #005 后端node调用文件打开对话框获取绝对路径传递给前端

时间:2024-09-10 22:23:20浏览次数:11  
标签:node 文件 const 对话框 filePath 绝对路径 electron path

文章目录

后端node调用文件打开对话框获取绝对路径传递给前端

1 目标

后端node调用文件打开对话框获取绝对路径。

2 步骤

2.1 src-electron/main.js

/*
 * @Author: alan.lau
 * @Date: 2024-09-08 20:35:17
 * @LastEditTime: 2024-09-10 21:30:27
 * @LastEditors: alan.lau
 * @Description:
 * @FilePath: \electron-demo\src-electron\main.js
 * 可以输入预定的版权声明、个性签名、空行等
 */
const { app, BrowserWindow, ipcMain,dialog } = require("electron");
const { join } = require("path");
const fs = require("fs");
const path = require("path");

// 屏蔽安全警告
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";

// 创建浏览器窗口时,调用这个函数。
const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true, // 使渲染进程拥有node环境
      //关闭web权限检查,允许跨域
      webSecurity: false,
      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
      preload: path.join(__dirname, "preload.js"), // 这里是预加载脚本的位置
    },
  });

  // win.loadURL('http://localhost:3000')
  // development模式
  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(process.env.VITE_DEV_SERVER_URL);
    // 开启调试台
    win.webContents.openDevTools();
  } else {
    win.loadFile(join(__dirname, "../dist/index.html"));
  }
};

// Electron 会在初始化后并准备
app.whenReady().then(() => {
  createWindow();
  app.on("activate", () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

app.on("window-all-closed", () => {
  if (process.platform !== "darwin") app.quit();
});

// 监听从渲染进程发来的 'read-file' 请求,并读取文件
ipcMain.handle('read-file', async (event, filePath) => {
    try {
        const data = fs.readFileSync(filePath, 'utf-8');
        return data;  // 返回文件内容
    } catch (error) {
        console.error('读取文件失败:', error);
        return null;
    }
});

// 主进程中添加 IPC 事件处理器,打开文件对话框并返回选中文件路径
// 处理打开文件对话框
ipcMain.handle("open-file-dialog", async () => {
  const { canceled, filePaths } = await dialog.showOpenDialog({
    properties: ["openFile"],
  });
  if (canceled) {
    return null;
  } else {
    return filePaths[0]; // 返回文件路径
  }
});

2.2 src-electron/preload.js

const { contextBridge, ipcRenderer } = require("electron");

contextBridge.exposeInMainWorld("electronAPI", {
  readFile: (filePath) => ipcRenderer.invoke("read-file", filePath),
  openFileDialog: () => ipcRenderer.invoke("open-file-dialog"), // 确保暴露的方法名称与前端一致
});

2.3 HelloWorld.vue

<script setup lang="ts">
import { ref, onMounted } from "vue";
import * as Cesium from 'cesium';

defineProps<{ msg: string }>()

const count = ref(0)
var viewer: Cesium.Viewer | null = null;
const filePath = ref<string | null>(null);
const fileContent = ref<string | null>(null);
onMounted(() => {
  viewer = new Cesium.Viewer('cesiumContainer', {
    terrain: Cesium.Terrain.fromWorldTerrain(), // 地形数据
  });
});

const handleReadFileFromNode = async () => {
  const content = await window.electronAPI.readFile('D:\\work\\111.txt');  // 读取文件内容
  console.log(content)

};

const handleSelectFile = async () => {
  const path = await (window as any).electronAPI.openFileDialog();
  if (path) {
    filePath.value = path;

    // 可选:读取文件内容
    const content = await (window as any).electronAPI.readFile(path);
    fileContent.value = content;
  }
};
</script>

<template>
  <el-button type="primary"  @click="handleSelectFile">选择文件</el-button>
  <p>选中文件路径: {{ filePath }}</p>
  <p>文件内容:</p>
  <pre>{{ fileContent }}</pre>
  <h1>{{ msg }}</h1>
  <el-button type="primary" @click="handleReadFileFromNode">我是 ElButton</el-button>

  <el-container class="home-container">
    <el-header>
    </el-header>
    <el-main>
      <div id="cesiumContainer">
      </div>
    </el-main>
  </el-container>
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

2.4 运行工程

  npm run tauri dev

看到一下界面说明成功

在这里插入图片描述

标签:node,文件,const,对话框,filePath,绝对路径,electron,path
From: https://blog.csdn.net/AlanL/article/details/142110162

相关文章

  • fnm安装及配置,Linux中实现node版本管理
    fnm安装及配置,Linux中实现node版本管理源码:Schniz/fnm:......
  • 基于nodejs+vue非结构化数据[程序+论文+开题] 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,数据量呈爆炸性增长,其中非结构化数据占据了绝大部分比例。非结构化数据,如文本、图像、音频、视频等,因其形式多样、内容丰富,在企业决......
  • Nodered学习记录-时间戳和时区设置
    昨天刷到个博主,跟着她的教程开始实践。Node-red的基础使用——inject/debug/function的使用(1)Node-red的基础使用——cronplus节点的使用(2)通过(1)大致理解了node-red里面的信息传递,以及javaScript写的function,虽说部分细节不甚明了,但不妨碍拿来用。到了(2)时,首先遇到的是cronpl......
  • 基于Node.js+vue基于vue的大学生兼职信息平台(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着高等教育的普及和就业市场的日益竞争,大学生在校期间寻找兼职工作已成为常态。然而,传统的兼职信息获取方式,如校园海报、社交媒体零散信息等,存在信息分散......
  • 计算机毕业设计nodejs+vue+express高校学生摄影社团管理系统 2ix7i
    目录技术栈具体实现截图系统设计解决的思路nodejs类核心代码部分展示可行性论证研究方法操作可行性源码获取技术栈该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是MySQL,为了更加便捷地使用数据库,用到了MySQL的可视化工具SQ......
  • Error response from daemon: This node is not a swarm manager.
    在环境上通过docker查看节点列表时,报错如下:解决方法: 具体code如下:root@controller1:~#dockerswarminit--advertise-addr127.0.0.1Errorresponsefromdaemon:Thisnodeisalreadypartofaswarm.Use"dockerswarmleave"toleavethisswarmandjoinano......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......
  • linux手动安装nodejs
    1.下载nodejs的安装文件,要选择编译好的  预构建二进制文件 这样就不用自己再编译安装了 https://nodejs.org/zh-cn/download/prebuilt-binaries2.下载完成后使用如下命令解压缩文件1)使用xz-dnode-v18.20.4-linux-x64.tar.xz 解压缩得到node-v18.20.4-linux......
  • 基于Node.js+vue基于的营养配餐评价系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和健康意识的增强,科学合理的膳食搭配成为了现代人追求健康生活方式的重要组成部分。然而,在日常饮食中,许多人因缺乏专业的营养知识和......
  • 基于Node.js+vue应急物资管理平台(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在自然灾害、公共卫生事件等突发事件频发的背景下,应急物资的高效管理与快速调配成为保障人民生命财产安全、维护社会稳定的关键环节。然而,传统的应急物资管......