2012-08-29 22 views
5

He escrito un código para descargar un archivo de un sitio web. El código funciona bien contra una prueba http url. Tan pronto como cambie la URL a https, obtengo un tiempo de espera de conexión.Uso de Java para descargar archivos desde una 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); 

Si copio la URL https en un navegador, se me pregunta dónde desea guardar el archivo y funciona bien. Cualquier ayuda muy apreciada. He tratado this pero no funcionó

Gracias Chris

+0

un vistazo aquí: http://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https –

Respuesta

4

Es posible que tenga problemas con el certificado. Este suele ser el problema que he encontrado en el pasado cuando trabajaba con conexiones HTTPS en Java.

En primer lugar, debe comprobar y ver si la URL a la que intenta conectarse tiene un certificado firmado por una CA raíz de confianza reconocida y es válida (no caducada).

Recomendaría que me permitieras abrir la URL en tu navegador y verificar la información del certificado.

Solo un FYI, puede haber una desconexión entre las CA de raíz de confianza reconocidas por su navegador y aquellas reconocidas por Java. Aquí hay otra pregunta de Stackoverflow sobre cómo obtener los reconocidos por Java: How can I get a list of trusted root certificates in Java?

Si se trata de un certificado autofirmado, entonces hay aros que deberá pasar para importarlos y usar un Almacén de claves local. Existen numerosos sitios y blogs que lo guiarán para hacerlo, aquí hay uno de esos blogs (no el mío): Adding self-signed https certificates to java keystore

Además, mientras prueba con el navegador, esto le ayudará a verificar que no haya problemas de proxy. Definitivamente debe verificar la configuración de su navegador para determinar si está o no en un servidor proxy.

Definitivamente debe considerar el uso de HttpClient en lugar de java.net.URL. Aquí está el Apache page for HttpClient 4.2.1.

Finalmente, si está buscando realizar una transferencia de archivos a través de HTTP o HTTPS, es posible que desee considerar WebDAV.

He usado Jakarta Slide WebDAV Client para esto en el pasado. Desafortunadamente, se ve como Slide is retired at this point, pero hay alternativas que puede encontrar con un poco de búsqueda.

ADEMÁS

Copié el ejemplo de código fuente y lo miré más de cerca. Parece que configura propiedades para http, pero no para https.

HTTPS tiene propiedades separadas:

  • https.proxyHost
  • https.proxyPort entorno

Probar:

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

mirada en la sección 2.2 en Oracle's Java Networking and Proxies.

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

+0

gracias por Philip Tomando el tiempo para responder, fue el System.setProperty ("https ... que lo entendió. ¡Había estado buscando tan difícil esta solución, tan simple! – Chris

1

Parece que el problema podría ser con el proxy. También debería ser compatible con https. Además, debe usar HttpClient 4 para descargar los archivos, es una biblioteca madura para hacer conexiones http.

0

System.setProperty("http.proxyPort", "80") debe ser System.setProperty("http.proxyPort", "443")

Cuestiones relacionadas