Показ индикатора выполнения при загрузке файла с сервера

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

Таким образом, я хочу показать индикатор выполнения пользователю, пока файл не приходит к Стороне клиента. Там какой-либо путь состоит в том, чтобы сделать это?

13
задан gkrogers 19 December 2010 в 11:28
поделиться

3 ответа

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

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

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

update

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

$.ajax({
    url:      "/myscripts/myserverscript",
    type:     "POST",
    data:     {
       foo: "bar"
    },
    dataType: "text",
    beforeSend: function(xhr){
        // display a progress animation
    },
    complete: function(xhr, status){
        // hide the animation
    }
    ...
});

В случае одного запроса. Вы также можете установить глобальный обработчик событий ajax для обоих (.ajaxStart() и .ajaxStop()), чтобы настроить функциональность показа/скрытия.

Ссылки: .ajax(), .ajaxStart(), .ajaxStop()

9
ответ дан 2 December 2019 в 00:57
поделиться

индикатор прогресса для генерации файла на стороне сервера:

Мы предполагаем, что серверу требуется много секунд для генерации файла. Это событие запускается исходным запросом, блокирующим операцию. Когда она завершится, файл будет сгенерирован и отправлен обратно клиенту.

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

Клейкие части здесь следующие:

  • когда оригинальный запрос генерирует файл, ему нужно сохранять прогресс через частые интервалы времени (т.е. каждые 10%). Хранение этих данных в http-сессии будет работать нормально.
  • другие запросы (ajax) просто должны быть в состоянии вытащить эту информацию из http сессии
  • синхронизация (сериализация доступа) на http сессии, то, что некоторые веб-приложения обычно делают, не может быть и речи, так как другие запросы (ajax) будут просто блокироваться, пока оригинальный запрос не завершится
  • на стороне клиента это все html+javascript для обеспечения взаимодействия, которое вам нужно (анимированный прогресс бар). Даже если интервалы очень грубые (скачки от 10% до 20% и 30%), вы можете анимировать полосу с помощью jQuery. Я уже делал это однажды в прошлом, и это выглядит великолепно.

прогресс-бар для загрузки файлов:

лучше оставить это на усмотрение родного диалога браузера.

3
ответ дан 2 December 2019 в 00:57
поделиться

В Java вы просто оборачиваете javax.swing.ProgressMonitorInputStream вокруг входного потока, но имейте в виду, что если сервер не посылает в режиме потоковой передачи, отображение ничего не будет значить, поскольку весь ответ будет считан в память до того, как первый байт будет доставлен в Java.

0
ответ дан 2 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: