【问题标题】:JavaFX WebView DownloadingJavaFX WebView 下载
【发布时间】:2015-03-22 14:59:38
【问题描述】:

我正在尝试将下载添加到我的 Web 浏览器,但我遇到的问题是获取您尝试下载的文件的名称。这是我的下载代码:

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。

【问题讨论】:

  • 嘿我怎么写下载方法。我也想从我的 webview 下载

标签: java javafx javafx-8


【解决方案1】:

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

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

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

因此,如果您想要一个真正强大的全功能浏览器,例如 Chrome 或 Firefox,您可以执行以上所有操作。作为horribly complicated test matrix shows,对于所有极端情况来说,这并不是一件特别容易的事情,即使是大人物也会弄错。

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

拦截任意网络点击也是如此,再次搜索 StackOverflow,它会出现一些关于此的问题,这可能让您可以右键单击下载功能。

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

您可以使用以下问题的答案从位置 URL 派生文件名:

【讨论】:

    【解决方案2】:

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

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

    所以基本上你可以从那里确定是要使用 URL 中的文件名还是 Content-Disposition 标头中指定的文件名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2017-03-29
      • 2019-02-13
      • 1970-01-01
      • 2016-11-18
      • 2012-11-01
      相关资源
      最近更新 更多