2010-04-13 21 views
6

Wie kann ich Downloads mit HttpResponse in Java verarbeiten? Ich habe eine HttpGet-Anfrage an eine bestimmte Site gestellt - die Site gibt die herunterzuladende Datei zurück. Wie kann ich mit diesem Download umgehen? InputStream scheint nicht in der Lage zu sein, damit umzugehen (oder vielleicht verwende ich es falsch).Umgang mit Downloads in Java

+3

Über welche API/Bibliothek sprechen Sie? [Apache HttpComponents HttpClient v4] (http://hc.apache.org/httpcomponents-client/index.html)? Wenn Sie nicht wissen, erwähnen Sie bitte den Paketnamen der Klassen "HttpResponse" und "HttpGet", über die Sie sprechen, und geben Sie vorzugsweise einen [SSCCE] (http://sscce.org) ein, damit wir Ihren Fehler erkennen können . – BalusC

+0

Tatsächlich verwende ich die Apache HttpComponents. Die Antwort, die du gepostet hast, scheint die zu sein, nach der ich suche. Wäre es jedoch möglich, alle Eingaben in eine Zeichenfolge im Vergleich zu einer tatsächlichen Datei zu speichern? Meine Konvertierung von Eingabestream in String-Methode verwendet einen gepufferten Leser, aber es gibt mir null. – Tereno

Antwort

8

Sie Unter der Annahme, tatsächlich über HttpClient sprechen, ist hier ein 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) {} 
     } 
    } 

} 

Werke hier in Ordnung. Dein Problem liegt woanders.

+0

Ich fügte den Inhaltstyp der Header (Application/Oktettstrom) und mit der gleichen Methode, die den Trick zu tun schien. – Tereno

0

Im Allgemeinen, wenn Sie möchten, dass der Browser das Download-Dialogfeld für eine Datei zum Herunterladen anzeigen, sollten Sie Setzen Sie den eingehenden Inhalt inputstream direkt in das Antwortobjekt steam und setzen Sie den Inhaltstyp der Antwort (HttpServletResponse Objekt) auf den entsprechenden Dateityp.

heißt

response.setContentType(.. relevant content type) 

Inhaltstyp kann als Beispiel application/pdf für PDF-Dateien sein.

Wenn der Browser ein Plugin hat, um die relevante Datei im Browserfenster anzuzeigen, öffnet sich die Datei und der Benutzer kann speichern, ansonsten zeigt der Browser die Downloadbox an.

+0

Fair raten, aber er spricht nicht über Servlet API :) – BalusC

+0

Hmmm ... Ich glaube, ich wurde wegen der httpresponse erwähnen .. Entschuldigung :) – Fazal

1

Öffnen Sie einen Stream und senden Sie die Datei:

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"); 
} 
Verwandte Themen