Отображение полосы выполнения при загрузке файла с сервера

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

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

Ответы

Ответ 1

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

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

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

Обновление

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

$.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()), чтобы установить функцию show/hide function.

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

Ответ 2

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

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

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

Клеи здесь:

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

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

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

Ответ 3

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