【问题标题】:Force download after ajax callajax调用后强制下载
【发布时间】:2011-10-11 05:39:30
【问题描述】:

我有一个 php 脚本正在等待 ajax 调用

www.mydomain.com/file.php

ajax 调用包含一些变量,file.php 将使用这些变量来生成一些 csv 结果,

用户是否可以下载由 file.php 生成的 csv 内容,而不必将其保存在服务器上的某个地方等等?

我也不想将用户重定向到任何其他页面,我希望他们单击​​一个按钮然后看到下载对话框,然后让他们下载 csv 文件。

【问题讨论】:

标签: php javascript ajax download


【解决方案1】:

当然,在输出任何内容之前,在 PHP 文件中将 content-type 设置为浏览器将下载的内容:

header("Content-Type: application/octet-stream");

此外,这也是一个很好的做法(并让您建议一个文件名):

header("Content-Disposition: attachment; filename=somefile.csv;");

根据浏览器的不同,有时只需要后者,但我通常同时使用两者来确保。

【讨论】:

  • 这对我不起作用,我的标题设置正确,我正在使用 $.post(url, options) 调用,没有任何反应,即使我可以看到 csv 内容也没有下载任何内容在提琴手
  • 哦,我明白你在做什么了,这在 AJAX 中可能是不可能的,也许看看这个:particletree.com/notebook/ajax-file-download-or-not
【解决方案2】:

将元素放入表单并提交它们似乎很麻烦,而且我使用它感觉不舒服。

当你使用这些类型的东西时,我认为你有点冒险,下一个版本的浏览器可能根本不支持它们。

除了我在我的 ajax 调用中将复杂的数组作为选项传递给服务器之外,将它们全部转换为 html 表单并不容易,除非我在隐藏元素中序列化数组并在服务器端反序列化它,但是这太复杂了。

我所做的是,当进行 ajax 调用时,服务器将输出存储在会话中,然后它返回该值的唯一键,服务器上的另一个页面将在给出该键时简单地回显输出将其作为输入,

所以用户点击某物,然后进行 ajax 调用,然后服务器将其存储在会话中,然后用户点击下载链接,然后服务器删除该会话。

这可能不是最完美的解决方案,特别是因为用户必须点击两次,但它对我来说似乎更标准。

【讨论】:

  • 男人!你让我很开心。它既复杂又简单。结合 NodeJS 和 node-cache 模块,我感觉自己就像在开发人员的天堂。为你 +1,谢谢 :)
【解决方案3】:

@user893730- 为什么将元素放入表单并提交“hacky”?另外,我不明白为什么序列化和反序列化数组数据是“复杂的”——有十亿个库正好支持这种事情。

【讨论】:

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