Отображение полосы выполнения при загрузке файла с сервера
Мне нужно показать индикатор выполнения пользователю, который запрашивает файл для загрузки. Я использую приложение 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.