如何在Electron App中显示"另存为"对话框?

djs*_*esh 12 node.js electron

我正在编写一个NodeJS Electron App,可以在所有平台上发布.我有一个下载按钮,我想打开一个"另存为"对话框,其中包含从服务器提供的文件.有人知道最好的方法吗?

以下是我在本地运行节点应用程序时尝试过的工作,但在使用electron-packager打包应用程序后失败了:

  • 将window.location.href设置为文件的位置
  • 将隐藏的iframe的src设置为文件的位置

运行打包的mac应用程序时,会触发"did-fail-load"事件并阻止显示"另存为"对话框.查看网络请求时,我可以看到该文件已从服务器成功检索到.我似乎无法弄清楚为什么"do-fail-load"事件被解雇了.

Ale*_*lex 10

如果您只想使用渲染器,下面是一个示例。单击 Electron 将显示标准浏览器的“另存为”对话框。不需要remote也不需要fs

<!--html-->
<button onclick="saveFile()">SAVE AS</button>
Run Code Online (Sandbox Code Playgroud)

在渲染器 JavaScript 文件中:

// renderer javascript file
function saveFile() {
    const content = "File content to save";
    const element = document.createElement("a");
    const file = new Blob([content], {type: "text/plain"});
    element.href = URL.createObjectURL(file);
    element.download = "file.txt";
    element.click();
}
Run Code Online (Sandbox Code Playgroud)

(我用的是mac,没有在Windows机器上尝试过)


use*_*864 7

看看电子文档中的这个页面https://github.com/atom/electron/blob/master/docs/api/dialog.md

有一个关于dialog.showSaveDialog的部分

然后,您可以使用保存对话框中的URL,使用与下面类似的功能将其保存到该位置.

session.on('will-download', function(event, item, webContents) {
  event.preventDefault();
  require('request')(item.getUrl(), function(data) {
    require('fs').writeFileSync('/somewhere', data);
  });
});
Run Code Online (Sandbox Code Playgroud)

在此页面上找到https://github.com/atom/electron/blob/master/docs/api/session.md


bob*_*bob 7

在 HTML 按钮上:

<button onclick='myUrlSaveAs("http://www.example.com/path/to/file.jpg")'>Save As</button>
Run Code Online (Sandbox Code Playgroud)

在您的 javascript 文件中:

// Include in the render side
var elerem = require('electron').remote;
var dialog = elerem.dialog;
var app = elerem.app;

var http = require('http');
var fs = require('fs');
var path = require('path');


function myUrlSaveAs(remoteUrl){
    // app.getPath("desktop")       // User's Desktop folder
    // app.getPath("documents")     // User's "My Documents" folder
    // app.getPath("downloads")     // User's Downloads folder

    var toLocalPath = path.resolve(app.getPath("desktop"), path.basename(remoteUrl) 

    var userChosenPath = dialog.showSaveDialog({ defaultPath: toLocalPath });

    if(userChosenPath){
        download (remoteUrl, userChosenPath, myUrlSaveAsComplete)
    }


}

function myUrlSaveAsComplete(err){
    alert("done");
}


function download (url, dest, cb) {
    var file = fs.createWriteStream(dest);
    var request = http.get(url, function(response) {
        response.pipe(file);
        file.on('finish', function() {
            file.close(cb); // close() is async, call cb after close completes.
        });
    }).on('error', function(err) { // Handle errors
        fs.unlink(dest); // Delete the file async. (But we don't check the result)
        if (cb) cb(err.message);
    });
};
Run Code Online (Sandbox Code Playgroud)