Javascript/jQuery: загрузка файла для загрузки

Есть ли способ узнать, что запущено событие браузера относительно файла, готового к загрузке? У меня есть 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();    
}
  1. Когда файл готов, функция create_pdf() вернет имя файла клиенту, а в моей функции успеха в ajax-запросе я вызову window.location = filename, который покажет мне "сохранить как окно".

Подготовка документа на стороне сервера вызывается ajax, но загрузка не выполняется!

  1. Проблема, возникающая в результате этого решения, - это хранение файлов, которые вы не хотите хранить на сервере. Таким образом, вы можете удалять файлы старше х часов с помощью bash script. Например fooobar.com/info/24230/...