如何在下载时向用户提供Ajax POST响应?

时间:2009-04-09 13:54:26

标签: php jquery download

我正在尝试在充满帐户信息的现有页面中加入vCard导出功能。

丑陋的方法将涉及1,将表单提交到同一页面,处理它并重新呈现整个页面,或2,GET以页面上的iframe为目标。我真的很想避免这两种情况,但我可能不得不使用#2来实现目标。

现在我有:

<input type="image" src="/intra/imgs/icons/vcard.png" onclick="$.post('/intra/vcard.php', { id: '992772', type: 'sponsor'});">

在某种意义上说,如果我在Firebug中观看XHR活动,我会看到请求返回正确的响应,充满了vCard格式的数据。但是,它不会提示用户将响应作为文件下载,即使该卡是以:

发送的
header('Content-Type: text/x-vcard');
header("Content-Disposition: attachment; filename={$this->name_first}{$this->name_last}.vcf");

我做错了什么,或者这是不可能的?

4 个答案:

答案 0 :(得分:6)

我很困惑究竟是什么问题。为什么不这样做:

<input type="image"
       src="/intra/imgs/icons/vcard.png"
       onclick="window.location='/intra/vcard.php?id=992772&type=sponsor';">

然后在vcard.php上返回相应的下载标头?当浏览器获得这些内容时,它将保留在同一页面上并提示下载。您必须更改代码以将变量处理为$_GET而不是$_POST,但您仍应使用GET进行此操作。

EDIT 正如评论中所指出的那样,这样做会更合适:

<a href="/intra/vcard.php?id=992772&type=sponsor"><img src="/intra/imgs/icons/vcard.png"></a>

从那时起,禁用javascript的用户就可以访问它。

答案 1 :(得分:2)

是的,你不能从xhr触发下载。我找到的唯一方法是选项#2,使用iframe。

也许一个jquery插件(我假设你正在使用jquery)对于这个目的来说是一种矫枉过正,但this可能对你有用。

答案 2 :(得分:0)

检查文件名'{$ this-&gt; name_first} {$ this-&gt; name_last} .vcf')是否有效以及firebug中的http响应! (标签网络,点击回复)。

是那里的内容并且正确吗? 内容长度是否正确? 怎么样的http状态?

答案 3 :(得分:0)

在发布期间生成内容,然后重定向到该内容。