与POST to server, receive PDF, deliver to user w/ jQuery类似,但这似乎不起作用......
我需要使用名称/值对的有效负载向服务器发送请求。服务器通过发送PDF文件进行响应
所有用户需要知道的是,在点击页面上的pdf按钮后,他们会获得浏览器的默认行为(即保存或查看)。
所以,这个电话很简单(我认为)
$.ajax({
url:"http://blah.com/etc",
data:{filename:'output.pdf', foo:'foo', bar:'bar', baz:'baz'},
type:"POST"
});
这就是所有服务器需要做的事情并返回output.pdf
看起来它工作正常。以下是响应标题:
Connection:keep-alive
Content-Disposition:attachment; filename="output.pdf"
Content-Length:17896
Content-Type:application/pdf
Date:Thu, 03 Oct 2013 04:19:06 GMT
Server:nginx
而且,如果我查看Chrome开发工具中的响应,它确实看起来像是一个17k pdf ...
最后一个障碍是浏览器(Chrome或FF)什么也没做,我想我错过了“现在将此响应作为可下载文件处理”的内容
答案 0 :(得分:1)
如果要保存/打开文件,可以选择使用php。见下文:
首先,创建一个文件名'download.php'包含以下代码:
$filename = $_GET['fname'];
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false); // required for certain browsers
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($filename) . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($filename));
readfile($filename);
$fp=fopen($filename,"rb");
if(!feof($fp)){
print(fread($fp,1024*8));
flush();
ob_flush();
if(connection_aborted){
}
}else{
echo 'File has been downloaded.';
}
exit;
然后,请调用download.php:
<a href="download.php?fname=sample.pdf">Sample file</a>
此代码可用于下载任何文件类型。
P.S。始终要小心路径和权限问题。
希望它有用......
干杯,
答案 1 :(得分:0)
我第一次回答自己的问题,所以,这里......
这里有关于此主题的JQuery论坛帖子http://forum.jquery.com/topic/download-file-from-jquery-post
这似乎不起作用的原因是,这些标题永远不会以浏览器可以响应的方式到达浏览器 - 在没有浏览器干预的情况下将AJAX结果传递给调用脚本。
真的很有道理。
仍然感兴趣的是任何人都有更好的解决方案但是,截至目前,我在运行时使用JQuery生成一个隐藏的表单然后触发.submit()
那是有效的。