electron 选择并显示带有电子的文件系统中的图像

ve7v8dk2  于 2023-04-03  发布在  Electron
关注(0)|答案(4)|浏览(252)

我正在Electron中开发一个小应用程序,我可以从中上传图像到Instagram,我被困在第一步之一:/
我想从文件系统中选择一个图像并将其显示在我的应用程序中。
这是我到目前为止得到的代码:
代码:

remote.dialog.showOpenDialog((filenames) => {
    fs.readFile(filepath, 'utf-8', (err, data) => {

        if(err){
            alert("An error ocurred reading the file :" + err.message);
            return;
        }
    });
});
3pvhb19x

3pvhb19x1#

默认情况下,file://协议是禁用的。因此,您必须 * 注册您自己的协议 *。感谢nicoNx的回答,其中包括电子协议文档的链接。以下代码是从Electron文档的直接副本:https://www.electronjs.org/docs/latest/api/protocol

const { app, protocol } = require('electron')
const path = require('path')
const url = require('url')

app.whenReady().then(() => {
  protocol.registerFileProtocol('atom', (request, callback) => {
    const filePath = url.fileURLToPath('file://' + request.url.slice('atom://'.length))
    callback(filePath)
  })
})

在你的html中:

<img src="atom://[FILE_ADDRESSS]" />

如果您遇到问题,请确保将协议附加到正确的浏览器会话。您可以在电子协议文档(上面的链接)中找到有关如何管理浏览器会话的更多详细信息。还请确保在应用程序准备就绪后注册协议。

vsnjm48y

vsnjm48y2#

一个最小的例子来选择,读取和显示一个png图像。
渲染器进程:::

var remote = require('electron').remote;
var fs = remote.require('fs');

  
remote.dialog.showOpenDialog(remote.getCurrentWindow(),
   {
    filters: [
      {name: 'Images', extensions: ['png']}
    ]
   }, 
   function(filepaths, bookmarks) {
     //read image (note: use async in production)
     var _img = fs.readFileSync(filepaths[0]).toString('base64');
     //example for .png
     var _out = '<img src="data:image/png;base64,' + _img + '" />';
     //render/display
     var _target = document.getElementById('image_container');
     _target.insertAdjacentHTML('beforeend', _out);

     return;
});
<div id="image_container"></div>
wb1gzix0

wb1gzix03#

以下是一个解决方案,其中包含有关main进程和renderer的分离以及es6的使用的更多信息

主进程

import { ipcMain, dialog } from "electron";
import fs from 'fs';

ipcMain.on("chooseFile", (event, arg) => {
  const result = dialog.showOpenDialog({
    properties: ["openFile"],
    filters: [{ name: "Images", extensions: ["png","jpg","jpeg"] }]
  });

  result.then(({canceled, filePaths, bookmarks}) => {
    const base64 = fs.readFileSync(filePaths[0]).toString('base64');
    event.reply("chosenFile", base64);
  });
});

渲染进程

import electron from 'electron';

// trigger file prompt
electron.ipcRenderer.send('chooseFile');

// handle response
electron.ipcRenderer.on('chosenFile', (event, base64) => {
  const src = `data:image/jpg;base64,${base64}`
})
mrphzbgm

mrphzbgm4#

下面的https://www.electronjs.org/docs/api/protocol代码片段适用于electron 11

app.whenReady().then(() => {
  protocol.registerFileProtocol('atom', (request, callback) => {
    console.log(request.url)
    const url = request.url.substr(7)
    callback({ path: url })
  })
})

请注意不要使用通常的file://协议,而是使用自定义的'atom'或'my_whatever'协议
现在你可以通过这种方式获得图像:

<img src="atom://C:\\Users\\my_path\\myfile.png" />

但是,如果你不想在渲染端保留file协议的语法,你可以这样做:

protocol.registerFileProtocol('file', ()=>...)

现在你可以用这种方法得到一个图像

<img src="file://C:\\Users\\my_path\\myfile.png" />

但是,您必须禁用webSecurity

const mainWindow = new BrowserWindow({
webPreferences: {
  nodeIntegration : true,
  webSecurity: false
}

相关问题