I wrote a program that downloads some files from some servers.
Currently program works properly. But I want to add resume support to it. I'm doing it like this But the result file is corrupted:....
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);
}
....
I'm Testing it on a server that I know supports resume.
I downloaded some bytes.(72720) Then Tried to resume it. Then I opened file with a Hex editor , At offset 72720开发者_如何学Go the first Bytes are repeated: Bytes 0-36: FLV.............«..........onMetaData Bytes 72720-72756: FLV.............«..........onMetaData It Starts download from the begining! While when I do it by wget it does correctly and responses by Content-Range field! Server responses with "302 FOUND" and a "206 Partial Content" in wget log. Can "302 FOUND" cause the problem?What is the problem ?
Thanks.Try:
connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-");
Lowercase the range specifier per the spec. Also, if your partial file was 500 bytes, that means your byte range that you have is 0-499, and you want 500+.
The problem is in (fcheck.length() - 1)
: this should be fcheck.length()
.
精彩评论