2010-04-13 5 views
6

Comment serais-je capable de gérer les téléchargements en utilisant HttpResponse en Java? J'ai fait une requête HttpGet à un site spécifique - le site renvoie le fichier à télécharger. Comment puis-je gérer ce téléchargement? InputStream ne semble pas être capable de le gérer (ou peut-être que je l'utilise dans le mauvais sens.)Gestion des téléchargements en Java

+3

De quelle API/bibliothèque parlez-vous? [Apache HttpComponents HttpClient v4] (http://hc.apache.org/httpcomponents-client/index.html)? Si vous ne connaissez pas, veuillez mentionner le nom du paquet des classes 'HttpResponse' et' HttpGet' dont vous parlez et de préférence publier un [SSCCE] (http://sscce.org) afin que nous puissions détecter votre erreur . – BalusC

+0

En effet, j'utilise Apache HttpComponents. La réponse que vous avez posté semble être ce que je cherche. Cependant, serait-il possible de stocker toutes les entrées dans une chaîne par rapport à un fichier réel? Ma conversion du flux d'entrée en méthode string utilise un lecteur tamponné mais cela me donne null. – Tereno

Répondre

8

En supposant que vous êtes en train de parler de HttpClient, voici un SSCCE:

package com.stackoverflow.q2633002; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class Test { 

    public static void main(String... args) throws IOException { 
     System.out.println("Connecting..."); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet("http://apache.cyberuse.com/httpcomponents/httpclient/binary/httpcomponents-client-4.0.1-bin.zip"); 
     HttpResponse response = client.execute(get); 

     InputStream input = null; 
     OutputStream output = null; 
     byte[] buffer = new byte[1024]; 

     try { 
      System.out.println("Downloading file..."); 
      input = response.getEntity().getContent(); 
      output = new FileOutputStream("/tmp/httpcomponents-client-4.0.1-bin.zip"); 
      for (int length; (length = input.read(buffer)) > 0;) { 
       output.write(buffer, 0, length); 
      } 
      System.out.println("File successfully downloaded!"); 
     } finally { 
      if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} 
      if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
     } 
    } 

} 

fonctionne très bien ici. Votre problème se situe ailleurs.

+0

J'ai ajouté le type de contenu à l'en-tête (Application/octet-stream) et en utilisant la même méthode, cela semblait faire l'affaire. – Tereno

0

En général, lorsque vous voulez que le navigateur affiche la boîte de dialogue de téléchargement d'un fichier à télécharger, vous devez définissez le contenu entrant inputstream directement dans l'objet de réponse steam et définissez le type de contenu de réponse (objet HttpServletResponse) sur le type de fichier approprié.

dire,

response.setContentType(.. relevant content type) 

Type de contenu peut être application/pdf pour les fichiers PDF à titre d'exemple.

Si le navigateur a un plugin pour montrer le fichier approprié dans la fenêtre du navigateur, le fichier s'ouvrira et l'utilisateur pourra alors enregistrer, sinon le navigateur affichera la boîte de téléchargement.

+0

Juste deviner, mais il ne parle pas de l'API Servlet :) – BalusC

+0

Hmmm ... Je pense que je me suis emporté en raison de la mention httpresponse .. Désolé :) – Fazal

1

Ouvrir un flux et envoyer le fichier:

try { 
    FileInputStream is = new FileInputStream(_backupDirectory + filename); 
    OutputStream os = response.getOutputStream(); 
    byte[] buffer = new byte[65536]; 
    int numRead; 
    while ((numRead = is.read(buffer, 0, buffer.length)) != -1) { 
     os.write(buffer, 0, numRead); 
    } 
    os.close(); 
    is.close(); 
} 
    catch (FileNotFoundException fnfe) { 
    System.out.println("File " + filename + " not found"); 
} 
Questions connexes