2010-08-05 18 views
9

Napisałem program, który pobiera pliki z niektórych serwerów.
Obecnie program działa poprawnie.
Ale chcę dodać do niego wsparcie resume.
robię to tak ale plik jest uszkodzony wynik:Java: wznów Pobierz w URLConnection

.... 

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

.... 

mam testowanie go na serwerze, który znam podpory wznowić.
Pobrałem niektóre bajty. (72720)
Następnie Próbowałem je wznowić.
Następnie otworzyłem plik za pomocą edytora szesnastkowego, Przy przesunięciu 72720 powtarzane są pierwsze Bajty:
Bajty 0-36: FLV ............. «........ ..onMetaData
Bajty 72720-72756: FLV ............. «.......... onMetaData
Rozpoczyna pobieranie od samego początku!
Podczas gdy robię to za pomocą wget, to działa poprawnie i odpowiada polu Content-Range!
Odpowiedzi serwera z "302 ZNALEZIONO" i "Częściową zawartością 206" w dzienniku wget.
Czy "302 FOUND" może spowodować problem?

Na czym polega problem?
Dzięki.

+0

Innym problemem jest niepotrzebnie zagnieżdżony blok/else. Skorzystaj z operatora '&&'. To znaczy. 'if (a && b && c) {fos = new FOS (name, true); } else {fos = new FOS (name); } '. to jest to! SUCHY. – BalusC

+0

Podsumowałem kod! w tych, jeśli jeszcze blokuje, podniosłem kilka komunikatów, więc powinno być tak, jak jest. ale dziękuję za odpowiedź. – RYN

+0

302 nie powinien stanowić problemu, ponieważ HTTPUrlConnection domyślnie wykonuje przekierowania. O ile nie przekręcasz wyraźnie przekierowań, które wątpię, ponieważ faktycznie dostajesz treść pliku –

Odpowiedz

17

Spróbuj:

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

Lowercase specyfikator zakres za spec. Ponadto, jeśli twój plik częściowy ma 500 bajtów, oznacza to, że masz zakres bajtów 0-499 i potrzebujesz 500+.

+0

Dzięki. Masz rację. Ale ma inny problem, ja zredagowałem oryginalny post i dodałem ten problem. Proszę to sprawdzić. dzięki – RYN

+0

Powinieneś rozważyć użycie czegoś takiego jak wireshark, aby upewnić się, że twój nagłówek żądania jest ustawiony prawidłowo. Możesz spróbować użyć addRequestProperty zamiast setRequestProperty, ale mam nadzieję, że oboje robią to samo. –

+0

Witam, przechwyciłem używając wireshark. jest ustawiony: "Zakres: bajty = 257177-"! ale zaczyna się znowu od bajtu 0! – RYN

3

Problem dotyczy (fcheck.length() - 1): powinien to być fcheck.length().

Powiązane problemy