最近在学习使用 electron 进行桌面开发一款图片压缩的软件。遇到了加载本地磁盘文件的问题。记录一下其解决方案。

使用 electron 加载本地磁盘文件

  • 第一种方法 设置webPreferences.webSecurity值为false

使用这个方法就是设置Chromium的启动安全参数,允许访问本地资源文件。由于Chromium是不允许在远程地址访问本地资源。只有本地资源访问本地资源,那么问题来了,使用 electron 启动的项目怎么设置访问本地路径资源呢? 代码配置如下

// main.js

const { app, BrowserWindow } = require("electron");
const createWindow = () => {
const mainWindow = new BrowserWindow({
width: 1024,
height: 600,
webPreferences: {
// 设置安全参数
webSecurity: false, // false 之后就可以访问 本地资源文件了
},
});
mainWindow.loadURL("http://localhost:3000"); // 本地服务链接
mainWindow.webContents.openDevTools();
}; app.on("ready", createWindow); app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
}); app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
<!-- localhost:3000 -->
<div>
<img src="D:/xxxx/xxx.png" />
访问本地图片地址
</div>

这样就可以在electron里正常访问本地资源了。

  • 第二种方法,注册自定义协议,来绕过Chromium安全检查。
// main.js

const { app, BrowserWindow, protocol } = require("electron");
const createWindow = () => {
const mainWindow = new BrowserWindow({
width: 1024,
height: 600,
});
mainWindow.loadURL("http://localhost:3000"); // 本地服务链接
mainWindow.webContents.openDevTools();
}; app.on("ready", createWindow); app.whenReady().then(() => {
// 注册协议 aaaa 协议名字无所谓 自定义即可
protocol.registerFileProtocol("aaaa", (request, callback) => {
const url = request.url.substr(7);
// 防止url 解析不正常 使用 decodeURI
callback(decodeURI(path.normalize(url)));
});
}); app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
}); app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
<!-- localhost:3000 -->
<div>
<img src="aaaa:///D:/xxxx/xxx.png" />
根据自定义协议名前缀 访问本地图片地址
</div>

使用 electron-forge 加载本地磁盘文件

electron-forge是 electron 的脚手架,类似于,react 的create-react-app或者 vue 的vue-cli,所有配置文件都是已经配置好的,根据需求在往上添加就可以用了。如果加载本地磁盘资源用以上办法还是不太行的。需要再加上一个配置才行。

forge.config.js或者package.json 设置plugins项,如下

{
"plugins": [
[
"@electron-forge/plugin-webpack",
{
"devContentSecurityPolicy": "`default-src 'self' 'unsafe-inline' data:;`", //设置 devContentSecurityPolicy 就可以访问本地资源了
"mainConfig": "./webpack.main.config.js",
"renderer": {
"config": "./webpack.renderer.config.js",
"entryPoints": [
{
"html": "./src/index.html",
"js": "./src/renderer.tsx",
"name": "main_window"
}
]
}
}
]
]
}

配置之后,再使用 上面的两种方法 其中一种就可以解决 手脚架加载本地磁盘文件的问题了。

下面贴上我当时开发的版本信息。

PS D:> node -v
# v14.18.2
PS D:> npm -v
# 6.14.15
{
"@electron-forge/cli": "^6.0.0-beta.61",
"electron": "16.0.5"
}

使用 electron 和 electron-forge 加载 本地磁盘资源 img 的问题的更多相关文章

  1. spring-boot 加载本地静态资源文件路径配置

    1.spring boot默认加载文件的路径是 /META-INF/resources/ /resources/ /static/ /public/ 这些目录下面, 当然我们也可以从spring bo ...

  2. WP8.1程序开发中,如何加载本地文件资源或安装在程序包中的资源。

    Web 要访问来自 Web 的文件,你可以使用标准的绝对 HTTP URI: <img src="http://www.contoso.com/images/logo.png" ...

  3. #iOS问题记录#动态Html加载本地CSS和JS文件

    所谓动态Html,指代码中组合生成的html字符串: 若需要加载本地CSS,图片,JS文件,则, 1,需要文件的全路径: 2,需要"file:///"标志: 例如: //获取文件全 ...

  4. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  5. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

  6. UIWebView加载本地html文件

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , KScreenWidth, KScreenHeight-)]; ...

  7. 填补Resources和WWW加载本地资源的坑

    总的来说Resources和WWW加载本地资源坑比较多,大多与路径有关. 下面代码构成了一个路径的预读模块: 此模块主要解决的坑是:Resources或WWW加载本地的文件夹中的多个文件时,无法获取文 ...

  8. viewpage listview gridview加载本地大图多图OOM处理办法

    很少上博客园写东西了. 最近在写公司项目,由于需要加载本地相册通过viewpager方式来加载, 最后发现直接进入界面就OOM了. 经过几天的整理最终搞定. 现在将加载本地和加载网络图片的缓存工具类贴 ...

  9. Android WebView加载本地html并实现Java与JS交互

    最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...

随机推荐

  1. 【LeetCode】280. Wiggle Sort 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序后交换相邻元素 日期 题目地址:https://l ...

  2. 【LeetCode】500. Keyboard Row 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解 字典 + set 日期 题目地址:https ...

  3. Codeforces 567C:Geometric Progression(DP)

    time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...

  4. Jmeter性能测试场景的创建和运行

    目录 性能测试场景的分析 项目背景 Jmeter指标 性能测试场景的设计以及准备 性能测试的总结 性能测试场景的分析 项目背景 ​ 实际工作中,我们拿到一个项目一般来说都会是项目经理说XXX来进行一下 ...

  5. Java中常见的转义字符

    转移字符对应的英文是escape character  , 转义字符串(Escape Sequence)字母前面加上捺斜线"\"来表示常见的那些不能显示的ASCII字符.称为转义字 ...

  6. Sentry 企业级数据安全解决方案 - Relay 入门

    内容整理自官方开发文档 Sentry Relay 通过提供作为应用程序和 sentry.io 之间中间层的独立服务来提供企业级数据安全性. Relay 专门设计用于: 在将个人身份信息 (PII) 发 ...

  7. 内联模板、X-Template

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...

  8. 初识python:斐波拉契数(列表获取)

    使用 列表 获取斐波拉契数,代码如下: n = int(input('您想获取前几个斐波拉契数?\n')) li = [] for i in range(n): if i <= 1: li.ap ...

  9. js获取设备内网ip

    可以直接使用,不需要导入其他配置 看代码 1 <script> 2 //获取内网ip 3 var RTCPeerConnection = window.RTCPeerConnection ...

  10. 安装Cacti-plugin

    安装pluginunzip cacti-plugin-0.8.7e-PA-v2.6.zip -d cacti-plugin-archcp -R cacti-plugin-arch/* /data/ww ...