2015-10-06 21 views
7

Tôi đang viết một Ứng dụng Điện tử NodeJS để phân phối trên tất cả các nền tảng. Tôi có một nút tải xuống mà tôi muốn bật mở hộp thoại Lưu với tệp được cung cấp từ máy chủ. Có ai biết cách tốt nhất để làm điều này?Làm cách nào để hiển thị hộp thoại Lưu dưới dạng trong Ứng dụng điện tử?

Dưới đây là những điều tôi đã cố gắng làm việc đó khi chạy ứng dụng nút cục bộ nhưng thất bại sau khi tôi đã đóng gói ứng dụng với electron-đóng gói:

  • Thiết window.location.href đến vị trí của tập tin
  • Thiết src của một iframe ẩn đến vị trí của tập tin

Khi chạy ứng dụng mac đóng gói, sự kiện "đã-không-load" là bắn và ngăn ngừa các hộp thoại Save As hiển thị. Khi xem xét các yêu cầu mạng, tôi có thể thấy rằng tệp được truy xuất thành công từ máy chủ. Tôi dường như không thể tìm ra lý do tại sao sự kiện "không tải được" đang được kích hoạt.

Trả lời

3

Hãy xem trang này trên các tài liệu điện tử https://github.com/atom/electron/blob/master/docs/api/dialog.md

Có một phần về dialog.showSaveDialog

Sau đó, bạn có thể sử dụng các URL từ tiết kiệm thoại với một chức năng tương tự như một trong những dưới đây để lưu nó vào vị trí đó.

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

Tìm thấy trên trang này https://github.com/atom/electron/blob/master/docs/api/session.md

+0

Cám ơn câu trả lời của bạn. Tôi đã không thể có được phương pháp này để làm việc. Tôi nghĩ rằng tôi đã có một vấn đề với yêu cầu các thư viện trong quá trình chính vs quá trình renderer. Cách tiếp cận ban đầu của tôi hoạt động sau khi tôi đã giết tất cả các mô đun nút và cài đặt lại chúng. Không chắc chắn chính xác điều gì đã gây ra sự cố, nhưng bây giờ hoạt động! – djsosofresh

0

Trên nút HTML:

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

Trong file javascript của bạn:

// 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

Bạn có thể cần phải giải thích cách đoạn mã này sẽ giải quyết câu hỏi .. –

Các vấn đề liên quan