【问题标题】:Download PDF resource from PHP to Javascript via Ajax通过 Ajax 将 PDF 资源从 PHP 下载到 Javascript
【发布时间】:2018-06-06 19:10:38
【问题描述】:

所以我会解释这个问题:

步骤:

1) 客户端(浏览器 javascript)向服务器发送一个 Ajax 请求,该请求会访问一个称为下载的控制器方法。

2) 控制器的方法创建一个 PDF 资源(不保存在文件系统上),并将带有 PDF 二进制流的响应返回给客户端。

3) 客户端接收PDF二进制流并下载到客户端计算机上。这可能吗?

代码: 我已经尝试过的东西 -

客户端:

<script>
    (function($) {

        var button; // some random DOM button

        button.on('click', function(e) {
            e.preventDefault();

            $.ajax({
                url: "/download/:userId"
                method: "POST",
                dataType: "json"
                success: function(response) {
                    var reader = new FileReader;
                    var file = new Blob([response.pdf_stream], 'application/pdf');

                    // create a generic download link
                    var a = $('<a/>', {
                        href: file,
                        download: response.filename
                    });

                    // trigger click event on that generic link.
                    a.get(0).click(); 
                }
            });
        }

    })(jQuery);


</script>

在服务器端:

class Controller
{
     public function download($userId)
     {
         // fetching the user from the database
         $user = User::find($userId);

         // creating a pdf file using barry pdfdom package
         // this will actually parse an HTML view and give us the PDF blob.
         $pdf = PDF::loadView('pdf.view')->output();

         // using Laravel helper function
         return response()->json([
             'pdf_stream' => utf8_encode($pdf),
             'filename' => 'blahblah.pdf"
         ]);

        // Or if you will in native PHP, just in case you don't use laravel.
        echo json_encode([
             'pdf_stream' => utf8_encode($pdf),
             'filename' => 'blahblah.pdf"
        ]);
     }
}

知道我在这里做错了什么吗?我如何下载该 PDF 文件而不将其保存到系统中(安全和空间问题)。

任何帮助将不胜感激。

伊甸园

【问题讨论】:

    标签: javascript php laravel pdf download


    【解决方案1】:

    如果您想在客户端下载 pdf,只需在新窗口中打开此 pdf。对这些事情使用 GET 请求,例如在 RESTfull 应用程序中(例如 download/user/:id 或类似的)。

    可能有用: Download and open pdf file using Ajax

    【讨论】:

    • 这更像是一条评论,因为服务器端代码输出的是 JSON 而不是 pdf。
    • @Victor 感谢您的回答,您能给出代码示例吗?你的意思是 window.open(file); ?那会奏效吗?文件是一个 blob(该文件不在我的服务器系统上)
    • window.open(route) - 在客户端并通过此路由在服务器端生成适当的 pdf
    • 有趣,你的评论让我找到了答案,我要试试这个:stackoverflow.com/questions/21729451/…
    • 啊,是的,您还必须在服务器端输出 pdf,而不是 @Musa 注意到的 json
    【解决方案2】:

    主要问题是控制器返回的响应。试试这个:

    public function download($userId)
         {
          // fetching the user from the database
          $user = User::find($userId);
    
          // creating a pdf file using barry pdfdom package
          // this will actually parse an HTML view and give us the PDF blob.
          $pdf = PDF::loadView('pdf.view')->output();
          return response($pdf, 200,
            [
              'Content-Type'   => 'application/pdf',
              'Content-Length' =>  strlen($pdf),
              'Cache-Control'  => 'private, max-age=0, must-revalidate',
              'Pragma'         => 'public'
            ]
          );
    

    关于调用执行download($userid)方法的路由:

    您不必使用 Ajax。简单的方法:

    <a href="/path/to/download/1" target="_blank">Click view PDF</a>
    

    【讨论】:

    • 感谢您的解决方案,我用 ajax 尝试了很多次,对于 PHP 到 Javascript 之间的一些解码和编码问题,它不起作用。所以最终我决定像你建议的那样使用完整的http请求,现在它可以工作了。再次感谢!
    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多