Java: резюме Скачать в URLConnection - PullRequest
       31

Java: резюме Скачать в URLConnection

9 голосов
/ 05 августа 2010

Я написал программу, которая загружает некоторые файлы с некоторых серверов.
На данный момент программа работает нормально.
Но я хочу добавить поддержку резюме.
Я делаю это так, но файл результатов поврежден:

....

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);
}

....

Я тестирую его на сервере, который, как я знаю, поддерживает резюме.
Я скачал несколько байтов. (72720)
Затем попытался возобновить его.
Затем я открыл файл с помощью шестнадцатеричного редактора. По смещению 72720 повторяются первые байты:
Байты 0-36: FLV ............. «.......... onMetaData
Байт 72720-72756: FLV ............. «.......... onMetaData
Загрузка начинается с самого начала!
В то время как когда я делаю это с помощью wget, он делает это правильно и отвечает полем Content-Range!
Сервер отвечает «302 НАЙДЕНО» и «206 Частичное содержимое» в журнале wget.
Может ли «302 НАЙДЕНО» вызвать проблему?

В чем проблема?
Спасибо.

Ответы [ 2 ]

17 голосов
/ 05 августа 2010

Попробуйте:

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

Строчный регистр спецификатора в соответствии со спецификацией.Кроме того, если ваш частичный файл был 500 байтов, это означает, что ваш диапазон байтов, который у вас есть, составляет 0-499, и вы хотите 500 +.

3 голосов
/ 05 августа 2010

Проблема в (fcheck.length() - 1): это должно быть fcheck.length().

...