2012-12-14 24 views
5

Mam aplikację kliencką Java do komputerów desktop, która ładuje pliki do usługi REST.Pasek postępu ładowania pliku przy użyciu opcji RestTemplate.postForLocation

Wszystkie połączenia z usługą REST są obsługiwane za pomocą klasy Spring RestTemplate.

Czekam na zaimplementowanie paska postępu i anulowanie funkcjonalności, ponieważ przesyłane pliki mogą być dość duże.

Szukałem sposobu na wdrożenie tego w Internecie, ale nie miałem szczęścia.

Próbowałem implementacji mojego ResourceHttpMessageConverter i podstawiania metody writeInternal(), ale ta metoda wydaje się być wywoływana podczas jakiejś buforowanej operacji przed faktycznym wysłaniem żądania (więc strumień jest czytany za jednym razem przed wysłaniem).

Próbowałem nawet przesłonić metodę CommonsClientHttpRequestFactory.createRequest() i implementować własną klasę RequestEntity za pomocą specjalnej metody writeRequest(), ale pojawia się ten sam problem (cały strumień jest czytany przed faktycznym wysłaniem wiadomości).

Czy szukam w niewłaściwym miejscu? Czy ktoś zrobił coś podobnego.

Wiele rzeczy, które czytałem w Internecie na temat wdrażania pasków postępu, mówi o tym, jak załadować przesyłkę, a następnie za pomocą oddzielnych żądań AJAX, aby odpytać serwer sieciowy o postęp, co wydaje się dziwnym sposobem na obejście tego problemu.

Każda pomoc lub wskazówki są mile widziane.

+0

to może mieć co szukasz http://stackoverflow.com/questions/5294532/httpclient-upload-big-file-and-show-sent-bytes-number – ams

+1

Dzięki za link. Niestety podany przykład wykorzystuje biblioteki apache o niskim poziomie, więc nie jestem pewien, jaka odpowiednia klasa FileBody znajdowałaby się w bibliotekach Spring Rest, ani jak mógłbym wprowadzić własną implementację do ich wykorzystania. – glidester

Odpowiedz

0

Nie było zbyt wielu szczegółów na temat tej aplikacji ani jej działania, więc ta odpowiedź jest niejasna, ale uważam, że możesz zrobić coś takiego, aby śledzić postęp przesyłania.

Jeśli to naprawdę jest aplikacja kliencka Java (np. Nie HTML/JavaScript, ale program java) i naprawdę masz to przesłać plik jako strumień, powinieneś być w stanie śledzić postęp przesyłania przez zliczanie bajtów w tablica transmitowana w buforze strumieniowym i porównująca to z całkowitą liczbą bajtów z obiektu pliku.

Gdy otrzymasz plik, otrzymasz jego rozmiar.

Integer totalFile = file.getTotalSpace(); 

gdziekolwiek jesteś przesyłania w postaci strumienia jesteś przypuszczalnie dodając bajtów do bufora wyjściowego jakiegoś

byte[] bytesFromSomeFileReader = [whatEverYouAreUsingToReadTheFile]; 

    ByteArrayOutputStream byteStreamToServer = new ByteArrayOutputStream(); 
    Integer bytesTransmitted = 0; 

    for (byte fileByte : bytesFromSomeFileReader) { 
     byteStreamToServer.write(fileByte); 
      // 
      // Update your progress bar every killo-byte sent. 
      // 
     bytesTransmitted++; 
     if((bytesTransmitted % 1000) = 0) { 
      someMethodToUpdateProgressBar(); 
     } 
    } 
+0

Przepraszam, ale to nie pomaga. Zasadniczo to rozwiązanie jest prawidłowe, ale jak napisałem w OP, strumień wydaje się być całkowicie odczytywany * przed * rozpoczęciem przesyłania. Tak więc pasek postępu osiągnąłby 100%, a następnie zostałby ustawiony tak długo, jak długo trwało przesyłanie. – glidester

+0

??? Jak to się czyta PRZED załadunkiem? Nie jest możliwe. Jak stwierdzono, nie podano szczegółów dotyczących tego, co się robi i w jaki sposób. Musisz podać rzeczywiste szczegóły, aby uzyskać bardziej szczegółową odpowiedź. – BrianC

+0

Również jeśli mówimy o kliencie, w jaki sposób jest czytany strumień? Powinien być napisany od klienta. – BrianC