Есть ли способ узнать, что запущено событие браузера относительно файла, готового к загрузке? У меня есть script, который генерирует файл, и пока это происходит, я показываю goding. После появления этого сообщения: http://i.stack.imgur.com/CmZHE.png (файл готов к загрузке, script закончен) Я хотел бы остановить gif.
Можно ли это узнать с помощью JS? Использование ajax является опцией, но займет больше времени, так как потребует нескольких изменений в системе.
Спасибо!
Ответ 1
Я сделал это в следующем примере: http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspx
Для PHP обратите внимание, что так вы отправляете файл cookie:
header('Content-type: application/octet-stream');
header('Set-Cookie: fileDownload=1; path=/');
header('Content-Disposition: attachment; filename='.$filename);
Путь выше действительно важен. Затем JS также нужен путь для удаления cookie, например:
$.removeCookie('fileDownload', { path: '/' })
Ответ 2
У меня была такая же проблема, и я выбрал решение в два этапа.
Я думаю, что это хорошее решение для показа и скрытия сообщения spinner.gif и/или ожидания при подготовке файла, пока загрузка не будет готова.
- Сначала я модифицирую свой якорь с помощью jQuery, чтобы вызвать функцию загрузки ajax bby, добавив
?cmd=prepare
в мой uri. Это подготовит мой PDF файл на стороне сервера и сохранит его в доступной папке клиентом (например, domain.ext/documents/my_pdf_name.pdf).
HTML (bootstrap 3):
<a href="/search/download" class="btn btn-primary pull-left download">
<i class="fa fa-file-pdf-o"></i> Download result in PDF
</a>
jQuery:
$(function() {
$('.download').on('click', function(e) {
e.preventDefault();
$('.loading').show();
url = $('.download').attr('href') + '?cmd=prepare';
$.ajax({
url: url,
type: 'get',
success: function(filename) {
console.log(data);
window.location = filename;
$('.loading').hide();
}
});
});
});
Сторона сервера PHP:
// ajax call
if(addslashes($_GET["cmd"]) == "prepare") {
echo create_pdf($_SESSION["search"], $out="prepare");
die();
}
- Когда файл готов, функция
create_pdf()
вернет имя файла клиенту, а в моей функции успеха в ajax-запросе я вызову window.location = filename
, который покажет мне "сохранить как окно".
Подготовка документа на стороне сервера вызывается ajax, но загрузка не выполняется!
- Проблема, возникающая в результате этого решения, - это хранение файлов, которые вы не хотите хранить на сервере. Таким образом, вы можете удалять файлы старше х часов с помощью bash script. Например fooobar.com/info/24230/...