2012-08-16 11 views
5

Poniższy fragment kodu pobiera plik z jakiegoś adresu URL i zapisuje go w pliku lokalnym. Bułka z masłem. Cóż może być tutaj nie tak?Kto manipuluje moim strumieniem danych?

protected long download(ProgressMonitor montitor) throws Exception{ 
    long size = 0; 
    DataInputStream dis = new DataInputStream(is); 
    int read = 0; 
    byte[] chunk = new byte[chunkSize]; 
    while((read = dis.read(chunk)) != -1){ 
     os.write(chunk, 0, read); 
     size += read; 
     if(montitor != null) 
      montitor.worked(read); 
    } 

    chunk = null; 
    dis.close(); 
    os.flush(); 
    os.close(); 
    return size; 
} 

Powodem jestem delegowania pytanie o to, ponieważ działa w 99,999% czasu i nie działa zgodnie z oczekiwaniami, gdy istnieje antywirusowego lub innego oprogramowania do ochrony zainstalowany na komputerze z systemem tego kodu. Ślepo wskazuję palcem w ten sposób, ponieważ za każdym razem, gdy go zatrzymuję (lub wyłączam), kod znów działa idealnie. Końcowym rezultatem takich zakłóceń jest to, że MD5 pobranego pliku nie pasuje do oczekiwanego i rozpoczyna się zupełnie nowa saga.

Pytanie brzmi - czy naprawdę możliwe jest, że jakiś inteligentny program "ochronny" zmieniłby rzeczywisty strumień pochodzący z adresu URL bez mojej wiedzy o tym? A jeśli tak - jak sobie z tym poradzić? (zweryfikowany przy użyciu produktów Kasperksy i Norton).


EDIT-1: Widocznie mam trzymać na ten problem i nie ma to nic wspólnego z programów antywirusowych. Pobieranie odbywa się z serwera FTP (w szczególności FileZilla) i używamy ftp Apache po stronie klienta. To, co zrobiłem, trafiło na serwer FTP i zakończyło połączenie (wyrzucono) w połowie pobierania. Spodziewałem się, że is.read (..) rzuciłoby wyjątek IOException po stronie klienta, ale tak się nie stało. Zamiast tego is.read (..) zwraca -1, co oznacza, że ​​nie ma więcej danych pochodzących ze strumienia. Jest to zdecydowanie nieoczekiwane i wyjaśnia, dlaczego czasami otrzymuję częściowe pliki. Nie wyjaśnia to jednak, dlaczego czasami dane również ulegają zmianie.

+1

Określ "barfy". – EJP

+1

Jak radzisz sobie z wyjątkami? Jeśli 'dis.close()' zgłasza wyjątek, strumień wyjściowy nie zostanie poprawnie zamknięty na przykład. – dacwe

+0

@dacwe - cokolwiek wyrzucono z tej metody jest niepowodzeniem, wszystko zostaje przerwane. Tajemnicą jest to, że nic nie zostaje rzucone, wszystko jest ładowane. Problem polega na tym, że nie są to dane, których się spodziewam, przez większość czasu są przecinane na pół, czasem zmienione. – Dima

Odpowiedz

1

Tak mi się to przydarza. W moim przypadku jest to spowodowane przez przezroczyste proxy HTTP przez Websense w mojej sieci korporacyjnej. Najgorszy problem spowodowany jest zwróceniem strony bloku z 200 OK.

Czy za każdym razem pojawia się takie samo lub podobne uszkodzenie? Np. Czy otrzymujesz kod HTML wyjaśniający, dlaczego żądanie zostało zablokowane? Najlepsze, co możesz prawdopodobnie zrobić, to porównać kilka pierwszych bajtów pobranych danych z pewnym tekstem na stronie bloku i w tym przypadku podać wyjątek.

Edycja: w oparciu o aktualizację, czy masz klienta FTP ustawionego na tryb obrazu/binarny?

+0

W moim przypadku nie jest to tekst, zauważyłbym, co zostało naruszone. Pobieram binarny pakiet instalacyjny, więc trudno powiedzieć, która jego część jest wysadzona. Rezultatem końcowym jest uszkodzenie binarne i całkowite pomylenie użytkowników końcowych, które wskazują na mnie, gdy jest to coś, co znajduje się w ich sieci. – Dima

+0

Musisz wypisać niepoprawne bajty na dysk i spojrzeć na nie. – artbristol

+0

może to dobry pomysł .. – Dima

Powiązane problemy