Skip to content

electron-custom-protocol-example-local-resource

electron 加载本地资源例子 https://github.com/xieerduos/electron-custom-protocol-local-resource-example

Electron 允许你通过自定义的方法加载本地文件,例如图片、音频和视频。

一、在应用启动前设置

在你的应用完全启动之前,你需要告诉 Electron 你想用一个特别的方式来处理本地文件。这就像是给你的应用设置一个特殊的通行证,允许它以一个安全的方式访问本地文件。

js
const fs = require("node:fs").promises; // 引入文件系统模块,用于操作文件

// 我们需要注册一个特别的名称(比如"local-resource")作为我们的“通行证”。
protocol.registerSchemesAsPrivileged([
  {
    scheme: "local-resource",
    privileges: {
      secure: true, // 让 Electron 信任这个方式就像信任网站的 HTTPS 一样
      supportFetchAPI: true, // 允许我们像在网页上那样请求资源
      standard: true, // 让这种方式的网址看起来像普通的网址
      bypassCSP: true, // 允许我们绕过一些安全限制
      stream: true, // 允许我们以流的形式读取文件,这对于大文件很有用
    },
  },
]);

二、处理你的自定义方式

一旦你的应用准备好了,你需要告诉 Electron 如何通过你的特殊“通行证”加载文件。

js
const fs = require("node:fs").promises; // 用于异步读取文件

app.whenReady().then(() => {
  // 一个辅助函数,用于处理不同操作系统的文件路径问题
  function convertPath(originalPath) {
    const match = originalPath.match(/^\/([a-zA-Z])\/(.*)$/);
    if (match) {
      // 为 Windows 系统转换路径格式
      return `${match[1]}:/${match[2]}`;
    } else {
      return originalPath; // 其他系统直接使用原始路径
    }
  }

  // 告诉 Electron 如何响应你的特殊方式的请求
  protocol.handle("local-resource", async (request) => {
    const decodedUrl = decodeURIComponent(
      request.url.replace(new RegExp(`^local-resource:/`, "i"), "")
    );

    const fullPath =
      process.platform === "win32" ? convertPath(decodedUrl) : decodedUrl;

    const data = await fs.readFile(fullPath); // 异步读取文件内容
    return new Response(data); // 将文件内容作为响应返回
  });
});

三、在页面中使用你的自定义方式

最后,当你想在你的应用的界面中显示这些本地文件时,只需要在文件的路径前加上你设置的特殊“通行证”即可。

html
<!-- 显示一张图片 -->
<img style="width: 100vw" src="local-resource://你的文件路径" />

或者,如果你想在 JavaScript 中动态加载:

js
window.addEventListener("DOMContentLoaded", async () => {
  const imageUrl = "你的文件路径"; // 获取图片的路径
  const el = document.querySelector("#app"); // 找到页面上的某个元素
  el.innerHTML = `<img style="width: 100vw" src="local-resource://${imageUrl}" />`; // 设置元素内容为图片
});

通过这些步骤,你可以安全且灵活地在 Electron 应用中加载和显示本地文件。