用jquery下载PDF

时间:2013-10-03 04:31:38

标签: javascript jquery ajax

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)什么也没做,我想我错过了“现在将此响应作为可下载文件处理”的内容

2 个答案:

答案 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()

那是有效的。