【问题标题】:PHP triggered download does not work when called by an Ajax call由 Ajax 调用调用时,PHP 触发下载不起作用
【发布时间】:2018-04-16 12:00:15
【问题描述】:

我构建了一个小的 PHP 脚本,它通过定义相应的标题来创建一个 Excel 电子表格并强制其下载。当我直接通过它的 URL 调用这个脚本时(或者甚至通过带有window.location.replace 的 JS),一切正常。 现在,当我通过 Ajax 调用(同步和异步)调用相同的脚本时,什么也没有发生。

有人可以解释这种行为吗?

问候塞巴斯蒂安

【问题讨论】:

  • 使用 ajax 下载总是会失败。为什么你需要 ajax 来完成这个任务?
  • 我并不迫切需要 ajax,但我对这种行为的原因很感兴趣。
  • 在 PHP 完成或创建 Excel 文件失败后,它需要将某种成功/失败消息发送回您的 AJAX,然后需要提供错误或您需要 redirect 用户到某种不重建 Excel 文件的专用下载页面。

标签: php ajax http-headers


【解决方案1】:

AJAX 请求在后台处理,因此下载标头将被忽略,仅传递给您的回调。

如果你想强制下载文件而不将他重定向到页面,你可以

  • 向页面注入 iframe 并将下载 url 作为 src 参数传递
  • 使用 a-tag 链接到下载 url,并在其中添加 HTML5 下载属性
  • 将您的 ajax 请求 base64 编码的结果作为 src 参数放入注入的 a-tag 中,并传递一个下载参数。

将 url https://stackoverflow.com/ 下载为“stackoverflow.html”的示例:<a href="https://stackoverflow.com/" download="stackoverflow.html">Click me!</a>

将文本“test”下载为“file.txt”的示例: <a href="data:text/plain;base64,dGVzdA==" download="file.txt">Click me</a>(其中dGVzdA== 是“测试”base64 编码)

注入两个 a-tag 后,您可以使用例如jQuery 来模拟用户点击它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2015-05-18
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多