Browser 使用JavaFXWebView下载

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(

我的web应用程序提供下载。Javascript在单击url时创建(取决于用户输入),浏览器应该打开它,这样页面就不会重新加载

为此,我认为我必须选择:

// 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);  
            }

            }
        });