0

类似于POST 到服务器,接收 PDF,使用 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)什么都不做,我想我错过了“现在将此响应作为可下载文件处理”的内容

4

2 回答 2

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>

此代码可用于下载任何文件类型。

PS 始终小心路径和权限问题。

希望它有用...

干杯,

于 2015-03-13T16:24:41.320 回答
0

我第一次回答了我自己的问题,所以,这里......

这里有一个关于这个主题的 JQuery 论坛帖子http://forum.jquery.com/topic/download-file-from-jquery-post

似乎这不起作用并且永远不会起作用的原因是这些标头永远不会以浏览器可以响应的方式到达浏览器 - AJAX 结果在没有浏览器干预的情况下传递给调用脚本。

真的很有意义。

仍然对任何人有更好的解决方案感兴趣,但是到目前为止,我正在使用 JQuery 在运行时生成一个隐藏表单,然后触发一个 .submit()

那行得通。

于 2013-10-03T06:20:37.277 回答