2015-10-06 9 views
7

Sto scrivendo un'app NodeJS Electron da distribuire su tutte le piattaforme. Ho un pulsante di download che mi piacerebbe aprire una finestra di dialogo Salva con il file che viene fornito dal server. Qualcuno conosce il modo migliore per farlo?Come posso visualizzare una finestra di dialogo Salva con nome in un'app Electron?

Qui sono le cose che ho provato che il lavoro quando si esegue l'applicazione del nodo locale, ma non riescono dopo aver confezionato l'applicazione con elettroni-packager:

  • Impostazione window.location.href alla posizione del file
  • Impostazione src di un iframe nascosto alla posizione del file

Quando si esegue il Mac App confezionato, l'evento "ha-fail-load" viene sparato e previene la finestra di dialogo Salva con nome dal mostrare. Osservando le richieste di rete, posso vedere che il file è stato recuperato con successo dal server. Non riesco a capire perché sia ​​stato licenziato l'evento "ha fallito".

risposta

3

Date un'occhiata a questa pagina sui documenti elettronici https://github.com/atom/electron/blob/master/docs/api/dialog.md

C'è una sezione su dialog.showSaveDialog

Quindi è possibile utilizzare l'URL dalla finestra di salvataggio con una funzione simile a quella sotto per salvarlo in quella posizione.

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

trovati su questa pagina https://github.com/atom/electron/blob/master/docs/api/session.md

+0

Grazie per la risposta. Non ero in grado di far funzionare questo metodo. Penso che stavo avendo un problema con la richiesta di librerie nel processo principale rispetto al processo di rendering. Il mio approccio originale ha funzionato dopo aver ucciso tutti i miei moduli di nodo e reinstallato. Non sei sicuro di quale sia stata la causa del problema, ma ora funziona! – djsosofresh

0

Sul pulsante HTML:

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

Nel file 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

Potrebbe essere necessario spiegare in che modo questo snippet di codice risolverà la domanda .. –