Я должен показать индикатор выполнения пользователю, который запрашивает файл загрузить. Я использую приложение J2EE для генерации файла. Пользователь отправит данные формы для получения файла. Сервер берет все отправленные данные, управляет, генерирует и передает файл PDF обратно Клиенту.
Таким образом, я хочу показать индикатор выполнения пользователю, пока файл не приходит к Стороне клиента. Там какой-либо путь состоит в том, чтобы сделать это?
Если я правильно вас понял, вы хотите показывать индикатор выполнения до тех пор, пока ваш сервер не будет готов отправить файл, а не показывать прогресс загрузки файла.
Если это так, то вы имеете дело со сложной задачей. Надежный прогрессбар должен знать (довольно точно), что вы делаете и сколько времени это займет. В вашем случае есть много ненадежных факторов (один из них, возможно, самый большой, это сам веб).
Поэтому большинство разработчиков используют что-то вроде "бесконечной" анимации для отображения "незавершенной работы".
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()
индикатор прогресса для генерации файла на стороне сервера:
Мы предполагаем, что серверу требуется много секунд для генерации файла. Это событие запускается исходным запросом, блокирующим операцию. Когда она завершится, файл будет сгенерирован и отправлен обратно клиенту.
В то же время вы хотите через другие запросы (ajax) обращаться к серверу и получать обратно процент за файл, который в данный момент генерируется для конкретного пользователя.
Клейкие части здесь следующие:
прогресс-бар для загрузки файлов:
лучше оставить это на усмотрение родного диалога браузера.
В Java вы просто оборачиваете javax.swing.ProgressMonitorInputStream вокруг входного потока, но имейте в виду, что если сервер не посылает в режиме потоковой передачи, отображение ничего не будет значить, поскольку весь ответ будет считан в память до того, как первый байт будет доставлен в Java.