2015-10-06 64 views
7

我正在編寫一個NodeJS電子應用程序,以在所有平臺上分發。我有一個下載按鈕,我想用服務器提供的文件彈出另存爲對話框。有沒有人知道這樣做的最佳方式?如何在Electron App中顯示另存爲對話框?

這裏是在本地運行的應用程序的節點,但我已經打包的應用程序與電子打包後失敗時,我已嘗試工作的事情:

  • 設置window.location.href到文件的位置
  • 隱藏的iframe的src設置爲文件

的位置,當執行包裝的Mac應用程序中,「沒有失效負荷」事件被觸發,並防止另存爲對話框無法顯示。在查看網絡請求時,我可以看到從服務器成功檢索到該文件。我似乎無法弄清楚爲什麼「did-fail-load」事件正在被解僱。

回答

3

看看這個頁面上的電子文檔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); 
    }); 
}); 

找到了這個網頁https://github.com/atom/electron/blob/master/docs/api/session.md

+0

謝謝您的回答。我無法使這種方法工作。我認爲我在主流程和渲染器流程中需要一些庫。在我殺死了所有節點模塊並重新安裝後,我的原始方法奏效。不確定究竟是什麼導致了問題,但現在的作品! – djsosofresh

0

在HTML按鈕:

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

在你的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); 
    }); 
}; 
+0

你可能需要解釋這段代碼如何解決這個問題。 –

相關問題