Java: descarga de currículums en urlconnection
-
26-09-2019 - |
Pregunta
Escribí un programa que descarga algunos archivos de algunos servidores.
Actualmente el programa funciona correctamente.
Pero quiero agregarle soporte de currículum.
Lo estoy haciendo así, pero el archivo de resultados está dañado:
....
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);
}
....
Lo estoy probando en un servidor que sé que admite el currículum.
Descargué algunos bytes. (72720)
Luego intenté reanudarlo.
Luego abrí el archivo con un editor hexadecimal, al desplazamiento 72720 se repiten los primeros bytes:
Bytes 0-36: FLV ............. «.......... Onmetadata
Bytes 72720-72756: FLV ............. «.......... Onmetadata
¡Comienza a descargar desde el comienzo!
¡Mientras que cuando lo hago por WGet, lo hace correctamente y las respuestas por el campo de rango de contenido!
Respuestas del servidor con "302 encontrado" y un "206 contenido parcial" en el registro WGET.
¿Puede "302 encontrado" causar el problema?
Cuál es el problema ?
Gracias.
Solución
Probar:
connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-");
Menús, el rango especificador según la especificación. Además, si su archivo parcial era de 500 bytes, eso significa que su rango de bytes que tiene es 0-499 y desea más de 500.
Otros consejos
El problema está en (fcheck.length() - 1)
: esto debería ser fcheck.length()
.