2013-06-05 5 views
2

J'ai un problème avec le téléchargement d'un fichier zip depuis une URL. Il fonctionne bien avec Firefox, mais avec mon application j'ai un 404.Java - Télécharger le fichier zip depuis l'url

Voici mon code

URL url = new URL(reportInfo.getURI().toString()); 
HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

// Check for errors 
int responseCode = con.getResponseCode(); 
InputStream inputStream; 
if (responseCode == HttpURLConnection.HTTP_OK) { 
    inputStream = con.getInputStream(); 
} else { 
    inputStream = con.getErrorStream(); 
} 

OutputStream output = new FileOutputStream("test.zip"); 

// Process the response 
BufferedReader reader; 
String line = null; 
reader = new BufferedReader(new InputStreamReader(inputStream)); 
while ((line = reader.readLine()) != null) { 
    output.write(line.getBytes()); 
} 

output.close(); 
inputStream.close(); 

Toute idée?

+1

Vous ne devrait pas faire une URL avec 'reportInfo.getURI() toString()', 'utiliser reportInfo.getURI() toURL()' – greedybuddha

Répondre

1

En ce qui concerne les raisons pour lesquelles vous obtenez un 404, c'est difficile à dire. Vous devriez vérifier la valeur de url, qui, comme le dit greedybuddha, vous devriez obtenir via URI.getURL(). Mais il est également possible que le serveur utilise une vérification d'agent d'utilisateur ou quelque chose de similaire pour déterminer si vous souhaitez ou non vous donner la ressource. Vous pouvez essayer avec quelque chose comme cURL pour récupérer de manière programmatique mais sans avoir à écrire du code vous-même.

Cependant, un autre problème se profile. C'est un fichier zip. C'est des données binaires. Mais vous utilisez InputStreamReader, qui est conçu pour texte contenu. Ne fais pas ça. Vous devez jamais utiliser un Reader pour les données binaires. Il suffit d'utiliser le InputStream:

byte[] buffer = new byte[8 * 1024]; // Or whatever 
int bytesRead; 
while ((bytesRead = inputStream.read(buffer)) > 0) { 
    output.write(buffer, 0, bytesRead); 
} 

Notez que vous devez fermer les flux dans finally blocs, ou utiliser l'instruction try-with-ressources si vous utilisez Java 7.

+0

. ok merci j'ai changé mais le résultat est le même. – BkSouX

+0

@bksoux: Je ne sais pas si vous avez lu ma version la plus récente - essayez de la récupérer avec cURL. Si vous obtenez une réponse 404 alors le problème ne peut pas être dans la partie lecture réelle ... mais nous ne pouvons pas faire beaucoup pour vous aider à diagnostiquer pourquoi vous obtenez un 404. –

3

En Java 7, le plus facile façon d'enregistrer une URL dans un fichier est:.

try (InputStream stream = con.getInputStream()) { 
    Files.copy(stream, Paths.get("test.zip")); 
} 
+0

ce qui est «con» partie de ? –

+0

@Robbo_UK 'con' est défini dans la deuxième ligne du code de la question d'origine. – VGR

+0

ahh je le vois maintenant. mon erreur. –

Questions connexes