jQuery使用AJAX显示从PHP文件获取的PDF数据

时间:2017-04-27 13:46:11

标签: php jquery json ajax file-get-contents

我正在尝试使用AJAX查询PHP文件并向用户显示PDF文件。 PHP文件的响应是存储在我的服务器上的PDF文件的原始数据。下面是我用来尝试完成此操作的代码,但它不起作用。我一直在浏览器中收到错误请求错误。有谁知道这样做的正确方法?

我的最终目标是我不希望用户能够看到我存储PDF文件的服务器路径。我只想使用AJAX / PHP脚本访问PDF文件。我知道这不是最安全的方法,但我只想让外行远离我的PDF文件。

jQuery的:

$.ajax({
        type: "POST",
        url: 'process.php',
        data: {"name" : "value"},
        success: function (data) {
          var json = $.parseJSON(data);
          if(json.hasOwnProperty('success')){
            window.location(json.success);
            // json.success should contain the pdf binary data
            // i just cant figure out how display the pdf in the browser
          }
        }
}); 

PHP:

<?php   
$fileName = $_POST['name'];
if(isset($fileName)){
    $file = './path-to-forms/'.$fileName.'.pdf';
    $pdfData = file_get_contents($file);
    $data = array("success" => $pdfData, "name" => $fileName);
    echo json_encode($data);
}
?>

1 个答案:

答案 0 :(得分:2)

  

有谁知道这样做的正确方法?

一些更改应该正确下载文件:

  • 更新PHP代码以使用base-64编码发送文件内容(即使用base64_encode()):

    $data = array("success" => base64_encode($pdfData));
    
  • 当AJAX响应完成时,创建一个锚点(链接)并使用.click()模拟单击它以启动PDF下载。我在api.jquery.com上找不到任何jQuery方法window.location() ...如果你找到它,请告诉我。也许您正在考虑更新(只读)属性window.location

    var json = $.parseJSON(data);
    if(json.hasOwnProperty('success')){
        var a = document.createElement("a");
        a.href = 'data:application/pdf;base64,'+json.success;
        a.download = "filePDF"; //update for filename
        document.body.appendChild(a);
        a.click();
        // remove `a` following `Save As` dialog, 
        // `window` regains `focus`
        window.onfocus = function () {                     
            document.body.removeChild(a)
        }
    } 
    

    来自guest虚拟机271314,来自this answer的改编代码以及来自answer below that的Alexandre代码的部分代码。

this phpfiddle中看到它。