Я разрабатываю небольшое приложение в 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;
}
});
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Минимальный пример выбора, чтения и отображения изображения 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>Есть ли способ прикрепить файловый буфер непосредственно к изображению? без конвертации в base64
Вот решение с дополнительной информацией о разделении процесса 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}`
})
Благодарю. для меня это было более понятно и понятно
С электроном 11 работает следующий фрагмент от https://www.electronjs.org/docs/api/protocol
app.whenReady().then(() => {
protocol.registerFileProtocol('atom', (request, callback) => {
console.info(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
}
Спасибо, в итоге я использовал эту строку fs.readFileSync (filepaths [0]). ToString ('base64') Я могу построить дальше оттуда.