4

有什么方法可以知道有关准备下载文件的浏览器事件已触发?我有一个生成文件的脚本,当这发生时,我显示了一个 laoding gif。一旦出现此消息:http: //i.stack.imgur.com/CmZHE.png(文件可供下载,脚本已完成)我想停止 gif。

有可能用JS知道这一点吗?使用 ajax 是一种选择,但需要更长的时间,因为它需要对系统进行多次修改。

谢谢!

4

2 回答 2

2

我是按照这个例子做的: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: '/' })
于 2013-08-06T15:15:15.743 回答
0

我遇到了同样的问题,并分两步选择了解决方案。

我认为这是一个很好的解决方案,可以在准备文件时显示和隐藏 spinner.gif 和/或等待消息,直到下载准备好开始。

  1. 首先,我用 jQuery 修改我的锚点,通过 ajax bby?cmd=prepare在我的 uri 上添加 a 来调用我的下载功能。这将在服务器端准备我的 PDF 并将其存储在客户端可访问的文件夹中(例如 domain.ext/documents/my_pdf_name.pdf)。

HTML(引导程序 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 查询中的成功函数中,我调用 awindow.location = filename来显示“另存为窗口”。

服务器端文档的编写是通过ajax调用的,但是下载不是!

  1. 此解决方案导致的问题是存储您不想保留在服务器上的文件。因此,您可以使用 bash 脚本删除超过 x 小时的文件。例如https://stackoverflow.com/a/249591/2282880
于 2017-02-14T20:27:12.010 回答