最近在学习使用 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"
}

最新文章

  1. SQL Server 分区表补充说明
  2. 像编程一样写文章—Markdown
  3. sql语句原则
  4. 枚举 POJ 1753 Flip Game
  5. Multi-Language IDE for Professional Developers (Komodo)
  6. 利用 Windows Azure 实现“云优先”
  7. Chapter 2 User Authentication, Authorization, and Security(3):保server避免暴力袭击
  8. 对于多线程下Servlet以及Session的一些理解
  9. Linux 获得机器的IP和网卡信息
  10. jQuery学习之旅 Item8 DOM事件操作
  11. Windows10 使用docker toolbox安装docker
  12. Docker学习之2——镜像
  13. DeepLearning.ai-Week4-Deep Learning &amp; Art: Neural Style Transfer
  14. 从零开始学 Web 之 移动Web(一)屏幕相关基本知识,调试,视口,屏幕适配
  15. (转)C# 快速高效率复制对象的方式
  16. SQL将Null转化为0
  17. HDU 2604 Queuing(递推+矩阵)
  18. Manjaro 系统添加国内源和安装搜狗输入法
  19. lombok-@Accessors注解
  20. Ubuntu 16.04下docker ce的安装(待完善)

热门文章

  1. 《Java必须知道的300个问题》读书总结
  2. 【LeetCode】455. Assign Cookies 解题报告(Java & Python)
  3. CSS实现水平垂直居中的方式有哪些?
  4. Mysql 设计超市经营管理系统,包括商品信息表(goods) 和 商品类型表(goodstype)
  5. .NET 微服务——CI/CD(3):镜像自动分发
  6. 乌龟NOI
  7. oracle 之 while循环月份
  8. python 用字典进行计数的三种常用方法
  9. 初识python: 递归函数 - 分解质因数
  10. Flask + flask_sqlalchemy + jq 完成书籍展示、新增、删除功能