JavaFX WebView 下载
JavaFX WebView Downloading
我正在尝试将下载添加到我的 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。
理想情况下,您要做的是在网络层拦截调用,并解释嵌入在 HTTP 流量中的 content disposition MIME messages。这些消息可以指示浏览器将文件下载为具有提供的文件名的附件。这就是当您单击 link 浏览器时,根据服务器发送的指令自动下载某些文件的结果。
浏览器做的另一件事是实现一种 mime 魔法,它们查看返回消息的 mime 内容类型、对网络流量的深入检查或只是 URL 位置的扩展前缀调用处理程序来下载特定的内容类型(您只在代码的后面执行)。
浏览器处理下载的最后一种方式是您可以右键单击页面或 link 然后选择另存为。
因此,如果您想要像 Chrome 或 Firefox 这样真正强大且功能齐全的浏览器,您可以执行上述所有操作。正如这个horribly complicated test matrix shows,对于所有极端情况来说,这并不是一件特别容易的事情,即使是大人物也会出错。
拦截 WebView 的网络流量是可能的,但很困难。您可以研究其他 Whosebug 问题来做到这一点 - 我不会在这里解决它。
拦截任意网页点击也是如此,再次搜索Whosebug,它会出现一些问题,这可能会让你右击下载功能正常工作。
所以你只剩下拦截 location 属性 变化了——显然不理想,但在许多情况下都是可行的。这意味着您不会在 content-disposition header 中获得编码的文件名,而是必须解析位置 url(只需获取最后一个 / 之后的所有内容)并将其设置为文件名。
您可以使用以下问题的答案从位置 URL:
导出文件名
JavaFX 8.0 中的WebView 无法显示网页时,状态会变为"CANCELLED"。这通常表示可下载文件,您可以检查该位置以确保或过滤您要下载的内容。
接下来,您可以从该位置创建一个 URL 并执行 HTTP HEAD 请求。这将允许您根据发回的 HTTP headers 获取文件名的可能选项。 header 可能包含一个名为 Content-Disposition 的 header,内容可能包含如下内容:附件;文件名="somfilename.ext".
所以基本上从那里您可以确定是要使用 URL 中的文件名还是 Content-Disposition header.
中指定的文件名
我正在尝试将下载添加到我的 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。
理想情况下,您要做的是在网络层拦截调用,并解释嵌入在 HTTP 流量中的 content disposition MIME messages。这些消息可以指示浏览器将文件下载为具有提供的文件名的附件。这就是当您单击 link 浏览器时,根据服务器发送的指令自动下载某些文件的结果。
浏览器做的另一件事是实现一种 mime 魔法,它们查看返回消息的 mime 内容类型、对网络流量的深入检查或只是 URL 位置的扩展前缀调用处理程序来下载特定的内容类型(您只在代码的后面执行)。
浏览器处理下载的最后一种方式是您可以右键单击页面或 link 然后选择另存为。
因此,如果您想要像 Chrome 或 Firefox 这样真正强大且功能齐全的浏览器,您可以执行上述所有操作。正如这个horribly complicated test matrix shows,对于所有极端情况来说,这并不是一件特别容易的事情,即使是大人物也会出错。
拦截 WebView 的网络流量是可能的,但很困难。您可以研究其他 Whosebug 问题来做到这一点 - 我不会在这里解决它。
拦截任意网页点击也是如此,再次搜索Whosebug,它会出现一些问题,这可能会让你右击下载功能正常工作。
所以你只剩下拦截 location 属性 变化了——显然不理想,但在许多情况下都是可行的。这意味着您不会在 content-disposition header 中获得编码的文件名,而是必须解析位置 url(只需获取最后一个 / 之后的所有内容)并将其设置为文件名。
您可以使用以下问题的答案从位置 URL:
导出文件名JavaFX 8.0 中的WebView 无法显示网页时,状态会变为"CANCELLED"。这通常表示可下载文件,您可以检查该位置以确保或过滤您要下载的内容。
接下来,您可以从该位置创建一个 URL 并执行 HTTP HEAD 请求。这将允许您根据发回的 HTTP headers 获取文件名的可能选项。 header 可能包含一个名为 Content-Disposition 的 header,内容可能包含如下内容:附件;文件名="somfilename.ext".
所以基本上从那里您可以确定是要使用 URL 中的文件名还是 Content-Disposition header.
中指定的文件名