我试图将下载内容添加到我的网络浏览器,但我遇到的问题是获取您尝试下载的文件的名称。这是我的下载代码:
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。
答案 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标题中指定的文件名。