Как отслеживать прогресс загрузки файла? - PullRequest
3 голосов
/ 09 июня 2011

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

Например, в случае загрузки у меня есть:

HttpURLConnection  connection = (HttpURLConnection) m_url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
while ((currentBytes  = stream.read(byteBuffer)) > 0) {                    
    totalBytes+=currentBytes;
    //calculate something...
}

Теперь мне нужно сделать то же самое для загрузки.но если использовать

OutputStreamWriter stream = new OutputStreamWriter(connection.getOutputStream());
stream.write(str);
stream.flush();

, тогда я не смогу получить уведомление о прогрессе, сколько байтов отправлено (похоже на автоматическое действие).

Есть предложения?

Спасибо

Ответы [ 6 ]

5 голосов
/ 23 сентября 2013

Просто установите режим передачи chunked и следите за своими собственными записями в выходной поток.

Если вы не используете режим передачи chunked или фиксированной длины, все ваши записи записываются в ByteArrayOutputStream перед записью всеть, так что Java может правильно установить заголовок Content-Length.Это то, что заставило вас думать, что это не блокирует.Это не так.

4 голосов
/ 22 июня 2011

Я использовал объект ChannelSocket. Этот объект позволяет блокировать чтение и запись при доступе к серверу. Поэтому я эмулировал HTTP, используя этот сокет, и каждый запрос на запись блокировался до тех пор, пока это не было сделано. Таким образом, я мог бы следить за фактическим прогрессом транзакции записи.

2 голосов
/ 09 июня 2011

В подобных ситуациях я создал подкласс FilterOutputStream , который переопределяет методы write (...) и может затем уведомить ваш код о любых записанных байтах.

1 голос
/ 09 июня 2011

Если вы хотите сосчитать загружаемые вами байты, запишите объекты в виде байтовых массивов в сам выходной поток, как вы делаете это с входным потоком.

0 голосов
/ 09 июня 2011

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

POST -> / uploadfile

  • ID
  • файл

POST -> / queryuploadstate (возвращает частичный размер)

  • ID

Конечно, сервлетам нужно подключаться и кластеризация не разрешена ...

0 голосов
/ 09 июня 2011

Это будет похоже на работу вашей загрузки.

OutputStream stream = connection.getOutputStream();
for(byte b: str.getBytes()) {                    
    totalBytes+=1;
    stream.write(b);
    if(totalBytes%50 == 0)
        stream.flush(); //bytes will be sent in chunks of 50
    //calculate something...
}
stream.flush();

Нечто подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...