【问题标题】:Forcing download of excel file through Ajax request fails silently通过 Ajax 请求强制下载 excel 文件静默失败
【发布时间】:2013-11-11 21:15:00
【问题描述】:

我正在尝试创建一个可点击的链接;当它被点击时,它会强制下载.xls 文件(甚至是另存为选项也不错)。这就是我下面的内容。

当链接被点击时,没有 php 日志错误,它会通过这段代码。该文件也确实存在。我的标题错了吗?

if (@file_exists("/tmp/report/{$php_session_id}.xls")) {
    $filename = "/tmp/report/{$php_session_id}.xls";
    $content_length = filesize($filename);

    header("Pragma: public");
    header("Expires: 0");
    header("Content-type: application/vnd.ms-excel");
    header("Content-length: {$content_length}");
    header("Content-disposition: attachment; filename=\"missing_addresses.xml\"");

    readfile($filename);


}

如果代码正确,是否有可能是服务器被锁定而无法执行此操作?

另外,我正在 Mac 版 Chrome 上进行测试(最新版本)

更新:我使用了 AJAX,这就是问题所在。

【问题讨论】:

  • “它通过这段代码”是什么意思?究竟会发生什么?
  • 我的意思是没有阻止它执行的错误。我在最后做了一个echo 声明,它“通过”到那个echo
  • 您不能通过 Ajax 启动下载,它只会在以太中消失。请改用location.href = "source.php";
  • @KickingLettuce 是的。或者,<a href='source.php' target='_blank'> 应该完全不使用任何 JavaScript 也有相同的效果
  • 在发送文件后调用 exit(0) 总是一个好主意,以防止其他任何东西进入缓冲区。

标签: php excel file http-headers


【解决方案1】:

您不能通过 Ajax 启动下载;作为正常的 Ajax 响应,响应将简单地消失在以太中。 (理论上你可以捕获它,但你不能将它写入磁盘。)

使用

location.href = "source.php";

<a href='source.php' target='_blank'>

直接将浏览器定向到资源。它会自动检测到是要下载的文件,并开始下载。

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 2012-08-26
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2012-11-11
    相关资源
    最近更新 更多