【问题标题】:Show local image file:///tmp/someimage.jpg显示本地图像文件:///tmp/someimage.jpg
【发布时间】:2020-10-25 16:59:25
【问题描述】:

场景

我正在为基于 BlazorServerSide 和 ElectronNET.API 版本 9.31.1 构建的 OSS 项目做出贡献。

在 Electron 窗口中,我们希望通过 <img> 标签显示来自本地存储 UI 的图像。

我尝试过的:

我试过了:

<img src="file:///home/dani/pictures/someimage.jpg" />

但不起作用。图像不出现。然后我尝试使用WebSecurity = false 创建电子窗口,但也没有帮助(图像在 UI 上显示为损坏):

var browserWindowOptions = new BrowserWindowOptions
{
    WebPreferences = new WebPreferences
    {
        WebSecurity = false,
    },
};

Task.Run(async () => await Electron.WindowManager.CreateWindowAsync(
    browserWindowOptions,
    $"http://localhost:{BridgeSettings.WebPort}/Language/SetCultureByConfig"
));

最后,作为解决方法,我将图像作为数据库64 发送到img src 的属性中,但这看起来是一种肮脏的方法。

我的问题:

我的问题是,如何从本地存储中显示电子窗口图片文件。

一些不相关的信息:

open source line 我需要帮助。

【问题讨论】:

  • 我在控制台中也得到了Not allowed to load local resource: file:///path/to/file.png
  • 感谢@dobson,感谢。
  • 你检查了这个答案吗? stackoverflow.com/a/50319258/13956032
  • 嗨@saraserin,我做到了。关于您可以在开发过程中禁用网络安全的回答讨论,我也尝试过,但没有成功。感谢您的评论。
  • 这几乎肯定是stackoverflow.com/questions/50272451/… 的副本,但由于您的赏金,人们不建议将其作为副本关闭。仍然:检查该帖子,因为您不应该使用file:/// URL。如果你在 localStorage 中有数据,请确保它是 data-url 格式的,这样你就可以直接使用它了吗?

标签: blazor-server-side electron.net


【解决方案1】:

有几种方法可以解决这个问题,因此我将尝试涵盖最相关的用例。其中一些取决于您的项目环境。

默认情况下,对本地文件的访问表现为跨源请求。您可以尝试在图像标签上使用crossorigin=anonymous 属性,但由于您的本地文件系统不会响应跨源标头,因此不起作用。

禁用webSecurity 选项是一种解决方法,但出于安全原因不建议这样做,并且如果您的html 也未从本地文件系统加载,通常也无法正常工作。

禁用 webSecurity 将禁用同源策略并将 allowRunningInsecureContent 属性设置为 true。换句话说,它允许执行来自不同域的不安全代码。

https://www.electronjs.org/docs/tutorial/security#5-do-not-disable-websecurity

以下是解决此问题的一些方法:

1 - 使用 HTML5 File API 加载本地文件资源并提供 ArrayBufferImageData 以将图像写入 &lt;canvas&gt;

function loadAsUrl(theFile) {
    var reader = new FileReader();

    var putCanvas = function(canvas_id) {
      return function(loadedEvent) {
        var buffer = new Uint8ClampedArray(loadedEvent.target.result);
        document.getElementById(canvas_id)
                .getContext('2d')
                .putImageData(new ImageData(buffer, width, height), 0, 0);
      }
    }

    reader.onload = putCanvas("canvas_id");

    reader.readAsArrayBuffer(theFile);
}

1.b - 也可以将文件加载为数据 URL。可以使用 JavaScript 将数据 URL 设置为 img 元素的源 (src)。这是一个名为 loadAsUrl() 的 JavaScript 函数,它展示了如何使用 HTML5 文件 API 将文件作为数据 URL 加载:

function loadAsUrl(theFile) {
    var reader = new FileReader();

    reader.onload = function(loadedEvent) {
        var image = document.getElementById("theImage");
        image.setAttribute("src", loadedEvent.target.result);
    }

    reader.readAsDataURL(theFile);
}

2 - 使用 Node API fs 读取文件,并将其转换为 base64 编码的数据 url 以嵌入到图像标签中。

Hack - 或者,您可以尝试在 BrowserView&lt;webview&gt; 中加载图像。前者覆盖您的BrowserWindow 的内容,而后者嵌入到内容中。

// In the main process.
const { BrowserView, BrowserWindow } = require('electron')

const win = new BrowserWindow({ width: 800, height: 600 })

const view = new BrowserView()
win.setBrowserView(view)
view.setBounds({ x: 0, y: 0, width: 300, height: 300 })
view.webContents.loadURL('file:///home/dani/pictures/someimage.jpg')

【讨论】:

  • 感谢您的回答,它寻找电子但不寻找 Electron.Net+Blazor。您的解决方案就是我所说的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多