2010-08-05 23 views
9

Escribí un programa que descarga algunos archivos de algunos servidores.
Actualmente el programa funciona correctamente.
Pero quiero agregar soporte para currículums.
lo estoy haciendo así, pero el archivo de resultados está dañado:Java: reanudar la descarga en URLConnection

.... 

File fcheck=new File(SaveDir+"/"+filename); 
if(resumebox.isSelected() && fcheck.exists()){ 
    connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-"); 
} 

connection.setDoInput(true); 
connection.setDoOutput(true); 

BufferedInputStream in = new BufferedInputStream (connection.getInputStream()); 

pbar.setIndeterminate(false); 
pbar.setStringPainted(true); 

java.io.FileOutputStream fos ; 
if(resumebox.isSelected()){ 
    if(fcheck.exists()){ 
     if(connection.getHeaderField("Accept-Ranges").equals("bytes")){ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename,true); 
     }else{ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
     } 
    }else{ 
     fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
    } 
}else{ 
    fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
} 

.... 

estoy probando en un servidor que sé soportes reanudan.
Descargué algunos bytes. (72720)
Luego intenté reanudarlo.
Luego abrí el archivo con un editor hexadecimal, en el desplazamiento 72720 se repiten los primeros bytes:
Bytes 0-36: FLV ............. «........ ..onMetaData
Bytes 72720-72756: FLV ............. «.......... onMetaData
¡Comienza la descarga desde el principio!
¡Mientras que cuando lo hago por wget lo hace correctamente y las respuestas por el campo Content-Range!
Respuestas del servidor con "302 FOUND" y un "206 Partial Content" en el registro de wget.
¿Puede "302 ENCONTRADO" causar el problema?

¿Cuál es el problema?
Gracias.

+0

El otro problema es que tiene un bloque if/else anidado innecesariamente profundo. Haga uso del operador '&&'. Es decir. 'if (a && b && c) {fos = nuevo FOS (nombre, verdadero); } else {fos = nuevo FOS (nombre); } ' Eso es. SECO. – BalusC

+0

¡He resumido el código! en esos bloques if else estoy subiendo algunos mensajes, así debería ser como está. pero gracias por tu respuesta. – RYN

+0

El 302 no debería ser un problema ya que HTTPUrlConnection sigue los redireccionamientos de forma predeterminada. A menos que esté desactivando los redireccionamientos explícitamente, lo cual dudo ya que realmente está obteniendo contenido de archivos –

Respuesta

17

Probar:

connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-"); 

Minúsculas la gama especificador por la especificación. Además, si su archivo parcial fue de 500 bytes, eso significa que su rango de bytes que tiene es 0-499 y quiere 500+.

+0

Gracias. Tienes razón. Pero tiene otro problema, edité la publicación original y agregué ese problema. Por favor, échale un vistazo. gracias – RYN

+0

Debería considerar usar algo como wireshark para asegurarse de que el encabezado de su solicitud esté configurado correctamente. Puede intentar usar addRequestProperty en lugar de setRequestProperty, aunque espero que ambos hagan lo mismo. –

+0

Hola, capturé usando wireshark. está configurado: "Rango: bytes = 257177-"! ¡pero comienza desde el byte 0 otra vez! – RYN

3

El problema está en (fcheck.length() - 1): esto debería ser fcheck.length().

Cuestiones relacionadas