我的web應用程序提供下載。 Javascript創建點擊url(取決於用戶輸入),瀏覽器應該打開它,這樣頁面不會被重新加載。使用JavaFX下載WebView
對於這一點,我想我必須選擇:
// Alt1:
window.open(pathToFile);
// Alt2:
var downloadFrame = document.getElementById('downloads');
if (downloadFrame === null) {
downloadFrame = document.createElement('iframe');
downloadFrame.id = 'downloads';
downloadFrame.style.display = 'none';
document.body.appendChild(downloadFrame);
}
downloadFrame.src = pathToFile;
下的Firefox這兩部作品。打開新窗口方法時出現的問題:如果在服務器上創建文件需要更多時間,則新的空標籤將遲到。 iframe問題:如果服務器出現錯誤,則不會給出反饋。
我認爲在Firefox上iframe是更好的解決方案。但是,Web應用程序也必須使用JavaFX WebView運行。 JavaFX沒有下載功能,我必須編寫它。一種可能的方式是聽上的位置屬性:
final WebView webView = new WebView();
webView.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observableValue, String oldLoc, String newLoc) {
if (newLoc.cotains("/download")) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Save " + newLoc);
File saveFile = chooser.showSaveDialog(webView.getEngine().getScene().getWindow());
if (saveFile != null) {
BufferedInputStream is = null;
BufferedOutputStream os = null;
try {
is = new BufferedInputStream(new URL(newLoc).openStream());
os = new BufferedOutputStream(new FileOutputStream(saveFile));
while ((readBytes = is.read()) != -1) {
os.write(b);
}
} finally {
try { if (is != null) is.close(); } catch (IOException e) {}
try { if (os != null) os.close(); } catch (IOException e) {}
}
}
}
}
}
存在一些問題:
- 下載開始依賴於URL的一部分,因爲JafaFX支持HTTP頭沒有訪問(這是可以忍受的)
- 如果用戶使用同一個url開始下載兩次,只有第一次下載工作(如果url是新的,只會觸發更改事件)。我可以創建獨特的網址(最後是#1,#2等)。但這很醜陋。
- 只有「window.open(pathToFile);」方法起作用。加載iframe不會觸發網站的更改位置事件。這是可以預期的,但我沒有找到合適的聽衆。
有人可以幫我解決2.或3.?
謝謝! PS:對不起,我的英語不好。
編輯: 對於2.我找到了一種方法。我不知道它是否是一個好的,如果它是高性能的,如果新的webview被刪除或下載後在緩存中,... 並且用戶沒有得到反饋,當出現問題時提高:
webView.getEngine().setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {
@Override public WebEngine call(PopupFeatures config) {
final WebView downloader = new WebView();
downloader.getEngine().locationProperty().addListener(/* The Listener from above */);
return downloader.getEngine();
}
}