Javascript / jQuery:文件下载就绪事件

时间:2013-08-04 16:46:31

标签: php javascript jquery browser

有没有办法知道有关准备下载的文件的浏览器事件已被解雇?我有一个生成文件的脚本,当发生这种情况时,我会显示一个laoding gif。一旦出现此消息:http://i.stack.imgur.com/CmZHE.png(文件准备下载,脚本完成)我想停止gif。

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

谢谢!

2 个答案:

答案 0 :(得分: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: '/' })

答案 1 :(得分:0)

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

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

  1. 首先我用jQuery修改我的锚点,通过ajax bby在我的uri上添加<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:for-each select= "//*/*/*[not(../following::*/* [not(name() = name(current()))] ) ]"> <xsl:value-of select="concat(name(), ' ')"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> 来调用我的下载功能。这将在服务器端准备我的PDF并由客户端将其存储在可访问的文件夹中(例如domain.ext / documents / my_pdf_name.pdf)。
  2. HTML(bootstrap 3):

    form1

    jQuery:

    ?cmd=prepare

    PHP服务器端:

    <a href="/search/download" class="btn btn-primary pull-left download">
        <i class="fa fa-file-pdf-o"></i> Download result in PDF
    </a>
    
    1. 当文件准备就绪时,函数$(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(); } }); }); }); 将文件名返回给客户端,在我的ajax查询中的成功函数中,我调用// ajax call if(addslashes($_GET["cmd"]) == "prepare") { echo create_pdf($_SESSION["search"], $out="prepare"); die(); } 向我显示“另存为窗口”。
    2. 服务器端文档的准备工作由ajax调用,但下载不是!

      1. 此解决方案产生的问题是存储您不想保留在服务器上的文件。因此,您可以使用bash脚本删除超过x小时的文件。例如https://stackoverflow.com/a/249591/2282880