JavaFX WebView下载

时间:2015-01-23 14:34:33

标签: java javafx javafx-8

我试图将下载内容添加到我的网络浏览器,但我遇到的问题是获取您尝试下载的文件的名称。这是我的下载代码:

engine.locationProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                File file = new File(System.getProperty("user.home") + "/Downloads/Ekko Downloads/");
                String[] downloadableExtensions = {".doc", ".xls", ".zip", ".exe", ".rar", ".pdf", ".jar", ".png", ".jpg", ".gif"};
                for(String downloadAble : downloadableExtensions) {
                    if (newValue.endsWith(downloadAble)) {
                        try {
                            if(!file.exists()) {
                                file.mkdir();
                            }
                            File download = new File(file + "/" + newValue);
                            if(download.exists()) {
                                Dialogs.create().title("Exists").message("What you're trying to download already exists").showInformation();
                                return;
                            }
                            Dialogs.create().title("Downloading").message("Started Downloading").showInformation();
                            FileUtils.copyURLToFile(new URL(engine.getLocation()), download);
                            Dialogs.create().title("Download").message("Download is completed your download will be in: " + file.getAbsolutePath()).showInformation();
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

问题在于:File download = new File(file + "/" + newValue);

我需要获取该文件的名称而不是newValue。

2 个答案:

答案 0 :(得分:3)

理想情况下,您要做的是拦截网络层的呼叫,并解释HTTP流量中嵌入的content disposition MIME messages。这些消息可以指示浏览器将文件下载为具有提供的文件名的附件。这就是当您单击浏览器链接时,根据服务器发送的指令自动下载某些文件的方法。

浏览器所做的另一件事是实现一种mime魔法,它们会查看返回消息的mime内容类型,深入检查网络流量或只是URL位置的扩展前缀来调用下载处理程序特定内容类型(您只在代码中执行稍后的操作)。

浏览器处理下载的最后一种方法是,您可以右键单击页面或链接,然后选择另存为。

所以,如果您想要一个非常强大的全功能浏览器,如Chrome或Firefox,您可以完成以上所有操作。就像这个horribly complicated test matrix shows一样,对于所有角落情况来说,这并不是一件特别容易的事情,即便是大家伙也弄错了。

拦截WebView的网络流量是可能的,但很困难。您可以研究其他StackOverflow问题 - 我不会在这里解决它。

拦截任意网页点击也是如此,再次搜索StackOverflow,它会提出一些问题,这可能会让你右键点击下载功能。

因此,您只需截取位置属性更改 - 显然不是理想的,但可用于许多场景。这意味着你没有在content-disposition头文件中编码文件名,而是你必须解析位置url(只需抓住最后一个/之后的所有内容)并将其设置为文件名。

您可以使用以下问题的答案从位置网址中获取文件名:

答案 1 :(得分:0)

JavaFX 8.0中的WebView在无法显示网页时会将状态更改为“已取消”。这通常表示可下载文件,您可以检查位置以确保或过滤要下载的内容。

接下来,您可以从该位置创建一个URL并执行HTTP HEAD请求。这将允许您根据发回的HTTP标头获取文件名的可能选项。标题可能包含名为Content-Disposition的标题,内容可能包含以下内容:attachment;文件名= “somfilename.ext”。

所以基本上你可以确定是否要使用URL中的文件名或Content-Disposition标题中指定的文件名。