我正在尝试在充满帐户信息的现有页面中加入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");
我做错了什么,或者这是不可能的?
答案 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)
在发布期间生成内容,然后重定向到该内容。