2010-04-13 14 views
6

¿Cómo voy a ser capaz de manejar las descargas mediante HttpResponse en Java? Hice una solicitud de HttpGet a un sitio específico: el sitio devuelve el archivo que se descargará. ¿Cómo puedo manejar esta descarga? InputStream no parece ser capaz de manejarlo (o tal vez lo estoy usando de la manera incorrecta)descargas de manipulación en Java

+3

Qué API/biblioteca está usted hablando? [Apache HttpComponents HttpClient v4] (http://hc.apache.org/httpcomponents-client/index.html)? Si usted no sabe, por favor mencione el nombre del paquete de la '' HttpResponse' y HttpGet' clases que estamos hablando y preferentemente al final de una [SSCCE] (http://sscce.org) para que podamos detectar su error . – BalusC

+0

De hecho, estoy usando Apache HttpComponents. La respuesta que publicó parece ser lo que estoy buscando. Sin embargo, ¿sería posible almacenar toda la entrada en una cadena frente a un archivo real? Mi conversión de la secuencia de entrada al método de cadena utiliza un lector de memoria intermedia pero me da nulo. – Tereno

Respuesta

8

Suponiendo que realmente está hablando HttpClient, He aquí 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) {} 
     } 
    } 

} 

funciona bien aquí. Tu problema está en otro lado.

+0

añadí el tipo de contenido a la cabecera (application/octet-stream) y usando el mismo método, eso pareció ser el truco. – Tereno

0

En general, cuando desea que el navegador muestre el cuadro de diálogo de descarga para descargar un archivo, debe establecer el contenido entrante inputstream directamente en el vapor objeto de respuesta y establecer el tipo de contenido de la respuesta (HttpServletResponse objeto) para el tipo de archivo correspondiente.

es decir,

response.setContentType(.. relevant content type) 

tipo de contenido puede ser application/pdf para archivos PDF como un ejemplo.

Si el navegador tiene un plugin para mostrar el archivo correspondiente en la ventana del navegador, el archivo se abrirá y el usuario puede guardar a continuación, de lo contrario el navegador mostrará el cuadro de descarga.

+0

conjetura Feria, pero él no está hablando de Servlet API :) – BalusC

+0

Hmmm ... Creo que me dejé llevar, debido a HttpResponse mención .. :) Lo sentimos – Fazal

1

Abrir una corriente y enviar el archivo:

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