В нашем текущем проекте мы обеспечиваем загрузку PDF-файла, который пользователь может настроить с помощью HTML-формы, которую он отправляет. Для динамического создания PDF-файла требуется несколько секунд, и я хотел бы это визуализировать, например отключив кнопку отправки, пока не начнется загрузка. К сожалению, я не смог найти способ определить, когда начинается загрузка *. Поэтому я бы не знал, когда снова включить кнопку отправки.
Я уже пытался указать IFrame в качестве цели моей HTML-формы, надеясь, что событие onload будет запущено. Однако это не так - вероятно, потому, что PDF-файл отправляется с заголовком «Content-disposition: attachment» и фактически не загружается в IFrame.
Единственное решение, о котором я могу думать прямо сейчас, - это создание PDF-файла во временный файл на сервере, чего я бы хотел избежать.
*) Позвольте мне прояснить это: мне не нужно было бы знать, была ли загрузка завершена или даже действительно ли она началась. Я хотел бы определить момент, когда браузер спросит пользователя, открыть или сохранить файл. Я предполагаю, что это происходит, когда браузер получает заголовок HTTP.
Итак, вы отправляете форму, а ответом на это представление является файл PDF? Во время паузы браузер находится в режиме ожидания ответа от сервера? это правильно?
@Breton: правильно! @Pretaul: я хотел бы знать, когда начнется загрузка. Итак, я мог создать временный файл, доставить некоторый HTML-ответ на скрытый IFrame, а затем получить временный файл с помощью JavaScript в обработчике загрузки.
Я знаю, что вы уже приняли ответ на этот вопрос, но, возможно, вы захотите взглянуть на мое сообщение в блоге, посвященное именно этой проблеме: gruffcode.com/2010/10/28/…
@Jesse Использование файлов cookie для этого - действительно отличная идея! Примерно на 6 лет опоздали для этого случая, но, возможно, будет полезно вспомнить. Спасибо за предупреждение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы хотите иметь возможность определять, когда размер загруженного файла изменяется с 0 на положительное значение. Насколько я знаю, это невозможно сделать с помощью javascript - вам нужен плагин, который может получить доступ к файловой системе клиента.
Рекомендуемый обходной путь: создайте сеанс для каждой загрузки. Попросите клиента опросить сервер о статусе загрузки. Это могло быть «не существовало», «не началось», «началось», «закончилось». Вам потребуется некоторая работа на стороне сервера, чтобы сохранить и обновить статус загрузки, а также инфраструктуру AJAX.
Спасибо за Ваш ответ! Меня действительно не волнует фактическая загрузка (в файл), достаточно знать, когда будет получен заголовок ответа HTTP. Я еще не совсем уверен, что это невозможно сделать в javascript.
Предложенная вами работа немного сложнее, чем то, что я искал. Но я думаю, это сработает, и это, безусловно, лучшая идея.
Я все еще не совсем уверен, что есть лучшее решение. Но сейчас я реализовал идею сеанса / статуса, поэтому я приму этот ответ. Еще раз спасибо.
Это решение лучше всего подходит для апплетов, потому что оно не требует смены апплета (что иногда может быть невозможно) и очень надежно (оно обнаруживает такие случаи, как запрос «разрешить java plugin» в браузере). Но, как недостаток, это требует дополнительной серверной службы.
Самым простым решением было бы оценить время (щедро) и сделать это таким образом. Это хитрость, но дает желаемый эффект. Другой вариант - отправить форму с обратным вызовом с помощью Ajax, чтобы отправить форму и заставить генератор возвращать детали на вызывающую страницу. http://www.jquery.com/ может быть хорошей отправной точкой для этого варианта.
Если бы я был вами, я бы сделал AJAX-вызов сервера с информацией, сгенерировал бы файл, а затем вернул бы имя файла / id / все что угодно обратно в javascript, который затем сделает window.location чем-то вроде download.php? Id = x (но файл уже был сгенерирован, поэтому он просто устанавливает заголовки и читает его), после чего вы можете повторно включить отправку.
Спасибо за Ваш ответ! То, что вы описываете, - это решение для "временного файла", о котором я упоминал, и которого я бы хотел избежать.
Ооо, мои извинения. Совершенно не видел этой части.
Вы хотите знать, когда загрузка начнется или когда она завершится? В любом случае, я не думаю, что временный файл будет иметь значение. На стороне клиента вы не можете определить, находится ли файл на сервере или сгенерирован «на лету».