2008-10-27 8 views
3

J'essaie de télécharger un fichier xml.gz à partir d'un serveur distant avec HttpsURLConnection dans Java, mais je reçois une réponse vide. Voici un exemple de mon code:Télécharger le fichier xml.gz avec HttpsURLConnection

URL server = new URL("https://www.myurl.com/path/sample_file.xml.gz"); 
HttpsURLConnection connection = (HttpsURLConnection)server.openConnection(); 
connection.connect(); 

Lorsque j'essaie d'obtenir un InputStream à partir de la connexion, il est vide. (Si j'essaie connection.getInputStream(). Read() j'obtiens -1) Le fichier que j'attends est d'environ 50MB.

Pour tester ma santé mentale, j'ai également essayé d'entrer exactement la même URL dans mon navigateur, et il a retourné le fichier dont j'avais besoin. Est-ce que je manque quelque chose? Dois-je définir une sorte de paramètre dans la connexion? Toute aide/direction est très appréciée.

Répondre

2

Une exception a-t-elle été enregistrée? Le site Web présente-t-il un certificat SSL auto-signé ou non signé par une autorité de certification? Il y a plusieurs raisons pour lesquelles cela pourrait fonctionner correctement dans votre navigateur (le navigateur pourrait avoir été invité à accepter des certificats auto-signés de ce domaine) et pas dans votre code.

Quels sont les résultats de l'utilisation de curl ou wget pour récupérer l'URL? Le fait que InputStream soit vide/résulte de InputStream.read() == -1 implique qu'il n'y a rien dans le flux à lire, ce qui signifie que le flux n'a même pas pu être configuré correctement.

Mise à jour: See this page pour quelques informations sur la façon dont vous pouvez traiter des certificats invalides/auto-signés dans votre code de connexion. Ou, si le site présente un certificat mais qu'il est invalide, vous pouvez l'importer dans le magasin de clés du serveur pour demander à Java de faire confiance au certificat. See this page for more info.

+0

Le tiers qui fournit le fichier m'a dit à l'origine CURL comme suit: boucle --location C - --digest -k https://www.myurl.com/path/sample_file.xml .gz -o sample_file.xml.gz cela fonctionne bien aussi! –

+0

le commutateur -k avec curl signifie "Autoriser les connexions aux sites SSL sans certs", donc je pense qu'il est prudent de supposer que le site ne présente pas un certificat valide. Vous devrez mettre à jour votre code pour prendre en compte cette commande –

+0

La commande curl fonctionne sans le commutateur -k. Je suppose que cela signifie que le CERT est valide. –

2
  1. Vérifiez la response code est de 200
  2. Vérifiez que connection.contentType pour vérifier le type de contenu est reconnu
  3. Vous devrez peut-être ajouter un contenu Handler pour le type GZ mime, que je ne me souviens pas de la haut de ma tête.

Après le commentaire décrivant le code de réponse comme 3xx,

  1. Set 'connection.setFollowRedirects (true)'

doit être corrigé.

+0

Le code de réponse est 302, ce qui signifie que "les données demandées résident réellement sous une URL différente". Je me demande si c'est mon problème ... Je suppose que c'est la raison pour laquelle le fournisseur m'a dit d'utiliser le paramètre "-location" lors de l'utilisation de curl pour télécharger le fichier. Y at-il un moyen de contourner cela? –

+0

'connection.setFollowRedirects (true)' devrait le faire. –

+0

La propriété followRedirects a la valeur true par défaut et j'ai pu voir l'URL redirigée. Mais, à partir de votre réponse originale, j'ai remarqué quand je fais connection.getContentType(), null est retourné. Cela signifie-t-il que je dois créer un ContentHandler [Factory] pour le type mime "application/x-gzip"? –

1

Il s'avère que le téléchargement ne fonctionnait pas car le serveur distant me redirigeait vers une nouvelle URL pour télécharger le fichier. Même si connection.setFollowRedirects (vrai) a été créé, je devais encore configurer manuellement une nouvelle connexion pour l'URL redirigée comme suit:

if (connection.getResponseCode() == 302 && connection.getHeaderField("location") != null){ 
      URL server2 = new URL(connection.getHeaderField("location")); 
      HttpURLConnection connection2 = (HttpURLConnection)server2.openConnection(); 
      connection2.connect(); 
      InputStream in = connection2.getInputStream(); 
} 

Après cela, j'ai pu récupérer le fichier à partir du flux d'entrée. Merci pour toute votre aide les gars!

+0

J'ai remarqué ceci aussi: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6810084 –

Questions connexes