2012-08-29 175 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")