2010-04-13 22 views
6

Jak mógłbym obsłużyć pliki do pobrania za pomocą HttpResponse w Javie? Zrobiłem żądanie HttpGet do określonej witryny - strona zwraca plik do pobrania. Jak mogę obsłużyć to pobieranie? InputStream wydaje się nie być w stanie go obsłużyć (lub może używam go w niewłaściwy sposób).Obsługa plików do pobrania w Javie

+3

Jakie API/biblioteki mówisz? [Apache HttpComponents HttpClient v4] (http://hc.apache.org/httpcomponents-client/index.html)? Jeśli nie wiesz, podaj nazwę pakietu "HttpResponse" i "HttpGet", o których mówisz, i najlepiej opublikuj [SSCCE] (http://sscce.org), abyśmy mogli zauważyć twój błąd . – BalusC

+0

Rzeczywiście używam Apache HttpComponents. Twoja odpowiedź wydaje się być tym, czego szukam. Czy byłoby jednak możliwe zapisanie wszystkich danych wejściowych w ciągu znaków w stosunku do rzeczywistego pliku? Moja konwersja strumienia wejściowego do metody łańcuchowej wykorzystuje buforowany czytnik, ale daje mi zerową wartość. – Tereno

Odpowiedz

8

Zakładając jesteś rzeczywiście mówić o HttpClient, Oto 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) {} 
     } 
    } 

} 

działa dobrze tutaj. Twój problem leży gdzieś indziej.

+0

Dodałem typ zawartości do nagłówka (Application/octet-stream) i używając tej samej metody, która wydawała się robić lewy. – Tereno

0

Ogólnie, gdy przeglądarka ma wyświetlać okno dialogowe pobierania pliku do pobrania, należy ustaw przychodzącą zawartość inputstream bezpośrednio w obiekcie kontrpara odpowiedzi i ustaw typ zawartości odpowiedzi (obiekt HttpServletResponse) na odpowiedni typ pliku.

tj

response.setContentType(.. relevant content type) 

typu treści można application/pdf dla plików PDF jako przykład.

Jeśli przeglądarka ma wtyczkę do wyświetlenia odpowiedniego pliku w oknie przeglądarki, plik otworzy się i użytkownik może zapisać, w przeciwnym razie przeglądarka wyświetli okno pobierania.

+0

Zgaduję, ale on nie mówi o Servlet API :) – BalusC

+0

Hmmm ... Myślę, że mnie porwał z powodu odpowiedzi httpresponse .. Przepraszam :) – Fazal

1

otworzyć strumień i wysłać plik:

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"); 
} 
Powiązane problemy