2012-08-29 129 views
5

我写了一些代码从网站下载文件。该代码工作正常,对测试http url。只要我将URL更改为https,就会有连接超时。使用Java从HTTPS URL下载文件

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 url复制到浏览器中,我被问到我希望保存文件的位置,它工作正常。任何帮助不胜感激。我曾尝试this但没有奏效

感谢 克里斯

+0

看一看这里:http://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https –

回答

4

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

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

我会建议在浏览器中打开URL并检查证书信息。

仅供参考,您的浏览器识别的受信任根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,但有一些选择可以通过一些搜索找到。

加成

我抄下来你的源代码样本,更仔细地看着。看起来像你为http设置属性,但不是https。

HTTPS具有独立的属性:

  • https.proxyHost
  • HTTPS。proxyPort

尝试设置:

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

一下第2.2 Oracle's Java Networking and Proxies

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

+0

菲利普感谢花时间回复,这是System.setProperty(“https ...明白了,我一直在寻找这样的解决方案,非常简单! – Chris

1

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

0

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