Индикатор загрузки файла с использованием RestTemplate.postForLocation

У меня есть настольное клиентское приложение Java, которое загружает файлы в службу REST.

Все вызовы службы REST обрабатываются с помощью класса Spring RestTemplate.

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

Я искал способ реализовать это в Интернете, но не повезло.

Я попытался реализовать свой собственный ResourceHttpMessageConverter и заменить метод writeInternal(), но этот метод, похоже, вызывается во время какой-то буферизованной операции до фактической отправки запроса (поэтому поток считывается за один раз перед отправкой).

Я даже пытался переопределить метод CommonsClientHttpRequestFactory.createRequest() и реализовать свой собственный класс RequestEntity со специальным методом writeRequest(), но возникает та же проблема (все потоки считываются до фактической отправки сообщения).

Я ищу в неправильном месте? Кто-нибудь делал что-то подобное.

Многое из того, что я читал в Интернете о реализации индикаторов выполнения, говорит о том, что загрузка отключена, а затем используются отдельные запросы AJAX для опроса веб-сервера на предмет прогресса, что кажется странным способом сделать это.

Любая помощь или советы с благодарностью.


person glidester    schedule 14.12.2012    source источник
comment
это может иметь то, что вы ищете и показать количество отправленных байтов"> stackoverflow.com/questions/5294532/   -  person ams    schedule 15.12.2012
comment
Спасибо за ссылку. К сожалению, в приведенном примере используются низкоуровневые библиотеки apache, поэтому мне не ясно, каким будет эквивалентный класс FileBody в библиотеках Spring Rest или как я могу внедрить свою собственную реализацию для их использования.   -  person glidester    schedule 21.12.2012


Ответы (1)


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

Если это действительно клиентское приложение Java (т.е. не HTML/JavaScript, а программа java), и вы действительно загружаете файл в виде потока, тогда вы сможете отслеживать ход загрузки, подсчитывая байты в передаваемом массиве. в буфере потока и сравнивая это с общим количеством байтов из файлового объекта.

Когда вы получите файл, получите его размер.

Integer totalFile = file.getTotalSpace();

Где бы вы ни передавали как поток, вы, вероятно, добавляете байты в какой-то выходной буфер.

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();
        }
    }
person BrianC    schedule 21.10.2015
comment
Извините, но это не помогает. В принципе, это решение правильное, но, как я сказал в ОП, кажется, что поток полностью прочитан до начала загрузки. Таким образом, индикатор выполнения доходил до 100%, а затем оставался там, сколько бы ни длилась загрузка. - person glidester; 22.10.2015
comment
??? Как это читается ДО загрузки? Это невозможно. Как уже говорилось, не было дано никаких подробностей о том, что и как делается. Вы должны были бы предоставить фактические данные, чтобы дать более подробный ответ. - person BrianC; 22.10.2015
comment
Также, если мы говорим о клиенте, как читается поток? Это должно быть написано с клиента. - person BrianC; 22.10.2015
comment
Поток, о котором я говорю, — это входной поток локального файла, который загружается на удаленный сервер. Я не могу предоставить какие-либо подробности сейчас, так как это был проект, над которым я работал 2 года назад! Как я уже сказал в OP, я полагал, что загружаемый контент буферизуется, поэтому потоки полностью считывались/записывались до начала любого сетевого трафика. Поэтому я не мог использовать эти потоки для реализации индикатора выполнения. - person glidester; 26.10.2015