网页包含指向可执行文件的链接(例如,如果我们点击该链接,浏览器将在您的本地计算机上下载该文件。)
有没有办法用Java实现相同的功能?
谢谢
答案 0 :(得分:1)
您可以使用Java的URL类来下载文件,但这需要一些工作。您需要执行以下操作:
openStream()
以获取InputStream
FileOutputStream
)InputStream
读取并写入文件,直到没有剩余数据可供阅读您正在下载的文件的类型并不重要(事实上它是一个可执行文件无关紧要),因为对于任何类型的文件,该过程都是相同的。
更新:听起来您真正想要的是将网页的网址插入Java应用,并让Java应用找到页面中的链接,然后下载该链接。如果是这种情况,你的问题的措辞是非常不清楚的,但这是我将使用的基本步骤:
InputStream
<a>
元素并提取其href
属性以获取您需要下载的文件的URL(如果它是相对URL而不是绝对URL,则需要解决该问题针对原始网址的网址)这是一个轻微的快捷方式,基于jsoup
(我以前从未使用过,我只是从他们网页上窃取的片段中写出来的)。我遗漏了很多错误检查,但是嘿,我通常会对此收费:
Document doc = Jsoup.connect(pageUrl).get();
Element aElement = doc.getElementsByTag("a").first() // Obviously you may need to refine this
String newUrl = aElement.attr("abs:href"); // This is a piece of jsoup magic that ensures that the destination URL is absolute
// assert newUrl != null
URL fileUrl = new URL(newUrl);
String destPath = fileUrl.getPath();
int lastSlash = destPath.lastIndexOf('/');
if (lastSlash != -1) {
destPath = destPath.substring(lastSlash);
}
// Assert that this is really a valid filename
// Now just download fileUrl and save it to destPath
正确的方式来确定目标文件名应该是什么(除非您对其进行硬编码)实际上是查找Content-Disposition
标头,并查找{{1}之后的位}。在这种情况下,您无法在网址上使用filename=
,而是需要使用openStream()
来获取URLConnection
。然后,您可以使用openConnection()
让getInputStream()
和InputStream
获取标题来确定您的文件名。如果标题丢失或格式错误,您应该回退到使用上面的方法来确定目标文件名。
答案 1 :(得分:1)
是的。 这是一个简单的例子:
您可以拥有一个JSF(Java Server Faces)页面,其中包含一个支持带有@PostConstruct
注释方法的支持bean。这意味着在创建页面时将发生任何操作(例如下载)。
已经存在一个非常相似的问题,请查看:Invoke JSF managed bean action on page load
答案 2 :(得分:0)
您可以使用apache commons IO FileUtils
执行此操作http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html#copyURLToFile(java.net.URL,java.io.File)
修改强>
我能够从source forge网站成功下载一个zip文件(它不是空的),它做了这样的事情
import java.io.File;
import java.net.URL;
import org.apache.commons.io.FileUtils;
public class Test
{
public static void main(String args[])
{
try {
URL url = new URL("http://sourceforge.net/projects/gallery/files/gallery3/3.0.2/gallery-3.0.2.zip/download");
FileUtils.copyURLToFile(url, new File("test.zip"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我也能成功下载tomcat.exe
网址网址=新网址(“http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.exe”);