Browser 使用JavaFXWebView下载
我的web应用程序提供下载。Javascript在单击url时创建(取决于用户输入),浏览器应该打开它,这样页面就不会重新加载 为此,我认为我必须选择:Browser 使用JavaFXWebView下载,browser,javafx,download,Browser,Javafx,Download,我的web应用程序提供下载。Javascript在单击url时创建(取决于用户输入),浏览器应该打开它,这样页面就不会重新加载 为此,我认为我必须选择: // Alt1: window.open(pathToFile); // Alt2: var downloadFrame = document.getElementById('downloads'); if (downloadFrame === null) { downloadFrame = document.createElement(
// 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应用程序也必须使用JavaFXWebView运行。JavaFX没有下载功能,我必须编写它。一种可能的方法是侦听location属性:
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) {}
}
}
}
}
}
final WebView WebView=new WebView();
webView.getEngine().locationProperty().addListener(新的ChangeListener()){
@Override public void changed(observeValue我认为您可能只需要使用copyURLtoFile来获取文件…在位置更改时调用该文件,或者使用注册的java类调用该文件。类似如下:
org.apache.commons.io.FileUtils.copyURLToFile(new URL(newLoc), new File(System.getProperty("user.home")+filename));
使用copyURLToFile当前页面不必为文件提供服务。我认为注册类可能是最简单的方法…类似这样:
PHP代码:
<a href='#' onclick="app.getfile('$filename' )">Download $filename</a>
这一部分将包含在主javafx类中:
Platform.runLater(new Runnable() {
@Override
public void run() {
browser2 = new WebView();
webEngine = browser2.getEngine();
appREF = new JavaApp(cloudFrame);
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == Worker.State.SUCCEEDED) {
JSObject win
= (JSObject) webEngine.executeScript("window");
// this next line registers the JavaApp class with the page... you can then call it from javascript using "app.method_name".
win.setMember("app", appREF);
}
}
});
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
browser2=新建WebView();
webEngine=browser2.getEngine();
appREF=新的JavaApp(cloudFrame);
webEngine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){
@覆盖公共无效已更改(ObservalEvalue ov、State oldState、State newState){
if(newState==Worker.State.successed){
JSObject win
=(JSObject)webEngine.executeScript(“窗口”);
//下一行在页面中注册JavaApp类……然后可以使用“app.method\u name”从javascript调用它。
win.setMember(“应用程序”,appREF);
}
}
});
您可能不需要框架引用…我正在修改一些自己的代码来测试它,而ref对其他事情很有用
public class JavaApp {
JFrame cloudFrameREF;
JavaApp(JFrame cloudFrameREF)
{
this.cloudFrameREF = cloudFrameREF;
}
public void getfile(String filename) {
String newLoc = "http://your_web_site.com/send_file.php?filename=" + filename;
org.apache.commons.io.FileUtils.copyURLToFile(new URL(newLoc), new File(System.getProperty("user.home")+filename));
}
}
Platform.runLater(new Runnable() {
@Override
public void run() {
browser2 = new WebView();
webEngine = browser2.getEngine();
appREF = new JavaApp(cloudFrame);
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == Worker.State.SUCCEEDED) {
JSObject win
= (JSObject) webEngine.executeScript("window");
// this next line registers the JavaApp class with the page... you can then call it from javascript using "app.method_name".
win.setMember("app", appREF);
}
}
});