通过Ajax将PDF资源从PHP下载到Javascript

时间:2018-06-06 19:10:38

标签: javascript php laravel pdf download

所以我将解释这个问题:

步骤:

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文件(安全性和空间问题)。

任何帮助都将不胜感激。

伊甸

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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>