开发者

Java: resume Download in URLConnection

开发者 https://www.devze.com 2023-01-10 14:14 出处:网络
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 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().

0

精彩评论

暂无评论...
验证码 换一张
取 消