使用Java从HTTPS URL下载文件

时间:2012-08-29 15:52:02

标签: java url https download connect

我已经编写了一些代码来从网站下载文件。该代码适用于测试http网址。然后,只要我将URL更改为https,我就会有一个连接超时。

System.setProperty("http.proxyHost","trproxy.rwe.com") ;
System.setProperty("http.proxyPort", "80") ;
Authenticator.setDefault (new MyAuthenticator("USER","PW"));
//URL url = new URL("http","www.treasury.gov",80,"/ofac/downloads/sdn.csv",new    sun.net.www.protocol.http.Handler());  THIS WORKS
URL url = new URL("https", "downloads.elexonportal.co.uk",443,"/bmradataarchive/download?key=MYKEY&filename="+filename,new sun.net.www.protocol.https.Handler());
url.openConnection();
InputStream reader = url.openStream();
FileOutputStream writer = new FileOutputStream("C:/downloads/"+filename);

如果我将https网址复制到浏览器中,系统会询问我希望保存文件的位置,并且工作正常。任何帮助非常感谢。我试过this但没有用

由于 克里斯

3 个答案:

答案 0 :(得分:4)

您可能遇到证书问题。这通常是我在Java中使用HTTPS连接时遇到的问题。

首先,您应该检查并查看您尝试连接的URL是否由知名的受信任根CA签署了证书,并且有效(未过期)。

我建议您在浏览器中打开网址并查看证书信息。

仅供参考,您的浏览器识别的受信任的根CA与Java识别的受信任的根CA之间可能存在脱节。这是另一个关于如何获得Java认可的Stackoverflow问题:How can I get a list of trusted root certificates in Java?

如果这是一个自签名证书,那么您需要了解有关将其导入和使用本地密钥库的问题。有很多网站和博客可以指导您完成此操作,这里有一个这样的博客(不是我的):Adding self-signed https certificates to java keystore

此外,在使用浏览器进行测试时,这将帮助您验证没有代理问题。您一定要检查浏览器的设置,以确定您是否要通过代理服务器。

你一定要考虑使用HttpClient而不是java.net.URL。这是Apache page for HttpClient 4.2.1

最后,如果您希望通过HTTP或HTTPS进行文件传输,您可能需要考虑WebDAV。

我过去曾使用Jakarta Slide WebDAV Client。不幸的是,它看起来像Slide is retired at this point,但您可以通过一些搜索找到替代品。

ADDITION

我复制了你的源代码示例并更仔细地查看了它。看起来您为http设置了属性,但没有为https设置属性。

HTTPS具有单独的属性:

  • https.proxyHost
  • https.proxyPort

尝试设置:

System.setProperty("https.proxyHost","trproxy.rwe.com") ; 
System.setProperty("https.proxyPort", "443") ; 

请参阅Oracle's Java Networking and Proxies上的第2.2节。

http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

答案 1 :(得分:1)

看起来您的问题可能与代理有关。它还应该支持https。 此外,您应该使用HttpClient 4来下载文件,它是一个用于建立http连接的成熟库。

答案 2 :(得分:0)

System.setProperty("http.proxyPort", "80")应为System.setProperty("http.proxyPort", "443")