Java: Wznów pobieranie w URLConnection
Napisałem program, który pobiera pliki z niektórych serwerów.
Obecnie program działa poprawnie.
Ale chcę dodać do niego wsparcie wznowienia.
Robię to tak, ale plik wynikowy jest uszkodzony:
....
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);
}
....
Testuję to na serwerze, który wiem, że obsługuje CV.
Ściągnąłem kilka bajtów.(72720)
Potem próbował go wznowić.
Następnie otworzyłem plik edytorem szesnastkowym, przy offsecie 72720 powtarzają się pierwsze bajty:
Bajty 0-36: FLV............."..........onMetaData
Bajtów 72720-72756: FLV............."..........onMetaData
Zaczyna pobierać od początku!
Podczas gdy gdy robię to przez wget robi to poprawnie i odpowiada przez pole content-Range!
Odpowiedzi serwera z "302 znalezione" I "206 częściowa zawartość" w dzienniku wget.
Czy "302 znalezione" może powodować problem?
Dzięki.
2 answers
Try:
connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-");
Małe litery określa zakres według specyfikacji. Ponadto, jeśli Twój plik częściowy miał 500 bajtów, oznacza to, że twój zakres bajtów wynosi 0-499, a chcesz 500+.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 04:29:10
Problem jest w (fcheck.length() - 1)
: to powinno być fcheck.length()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 04:29:50