2010-04-16 37 views
8

Estoy descargando archivos zip del servidor web usando Java, pero de alguna manera estoy perdiendo aproximadamente 2kb en cada archivo. No sé por qué, ya que el mismo código funciona bien con otros formatos, por ejemplo, texto, mp3 y extra. se agradece cualquier ayuda? aquí está mi código.¿descargar archivo zip usando java?

public void download_zip_file(String save_to) { 
    try { 
     URLConnection conn = this.url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestProperty("content-type", "binary/data"); 
     InputStream in = conn.getInputStream(); 
     FileOutputStream out = new FileOutputStream(save_to + "tmp.zip"); 

     byte[] b = new byte[1024]; 
     int count; 

     while ((count = in.read(b)) > 0) { 
      out.write(b, 0, count); 
     } 
     out.close(); 
     in.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

¿Tiene control total sobre el servidor donde está alojado el archivo zip? ¿Funciona si descarga el archivo zip usando un navegador web normal? – BalusC

+0

No tengo acceso al servidor web, pero funciona bien en el navegador. Cambié el agente de usuario y todo funcionó bien. – Mohamed

+0

Drat, hubiera sugerido exactamente eso en una respuesta cuando confirmaste que funciona bien en un navegador normal :) El 'setDoOutput (true)' por cierto implícitamente establece el método de solicitud en POST. Normalmente no desea usarlo para descargas de archivos puros. Algunos servidores rechazarán la descarga cuando lo solicite POST en lugar de GET. – BalusC

Respuesta

0

tratar de eliminar las líneas:

conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestProperty("content-type", "binary/data"); 
+0

hizo eso, y nada cambió. – Mohamed

3

Debería ser de la siguiente manera:

while ((count = in.read(b)) >= 0) 

in.read puede volver 0.

+0

ya lo hizo, solo lo mismo. – Mohamed

+0

No importaría.Si devuelve 0, simplemente no hay nada que escribir y, por lo tanto, tampoco es necesario escribir. – BalusC

+0

Sí, importa. -1 debería romper el ciclo y nada más. – zockman

0

Tuve un problema con la descarga de archivos comprimidos de http una vez que resultó que mis descargas incluían encabezados http al principio, pero eso hizo que mis archivos fueran un poco más grandes, no más pequeños, por lo que probablemente no tenga este problema .

Como nota al margen, puede considerar el uso de Apache Commons Net para descargar las aplicaciones relacionadas, es realmente genial.

0

Hace unos años recuerdo haber tropezado con un problema con una versión anterior de Tomcat (5.5.25 para memoria) que causaría truncar las descargas más grandes. Solucionamos esto actualizando a 5.5.27. También recuerdo que el mismo problema se encontró y se solucionó en una versión anterior de Tomcat 6.0.

Si esto le suena las campanas, eche un vistazo a los registros de cambios de Tomcat.

0

Solo archivos zip, ¿eh? Muy raro. ¿Es de cualquier servidor, o solo este? Si cambia el nombre del archivo (cambie la extensión) ¿obtiene el mismo problema? ¿Qué bytes faltan? ¿Estás seguro de que son los últimos 2K bytes y no algún fragmento del medio/etc ...?

+0

Mencionó hace 45 minutos en un comentario de pregunta que ya lo hizo funcionar cambiando el agente de uso. – BalusC

+0

Bueno, eso es extraño. No veo ningún comentario al respecto en ningún lugar de este tema ... –

2

Ponga un out.flush() justo después de la sección "while ((count = in.read(b)) > 0) {...}" y antes del out.close().

Cuestiones relacionadas