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

通过Ajax将PDF资源从PHP下载到Javascript,javascript,php,laravel,pdf,download,Javascript,Php,Laravel,Pdf,Download,因此,我将解释问题: 步骤: 1) 客户端(浏览器javascript)向服务器发送一个Ajax请求,该请求会命中一个名为download的控制器方法 2) 控制器的方法创建一个PDF资源(不保存在文件系统上),并将带有PDF二进制流的响应返回给客户端 3) 客户端接收PDF二进制流并将其下载到客户端计算机上。可能吗 代码: 我已经尝试过的事情- 客户端: <script> (function($) { var button; // some random

因此,我将解释问题:

步骤:

1) 客户端(浏览器javascript)向服务器发送一个Ajax请求,该请求会命中一个名为download的控制器方法

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>
知道我做错了什么吗?我如何下载PDF文件而不将其保存到系统中(安全性和空间问题)

任何帮助都将不胜感激


Eden

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

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

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'
        ]
      );
关于调用执行
下载($userid)
方法的路由:

您不必使用Ajax。简易方法:

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


这更像是一个注释,因为服务器端代码输出的是JSON而不是pdf。@Victor谢谢你的回答,你能给出代码示例吗?你是说窗口打开(文件)?这样行吗?文件是一个blob(文件不在我的服务器系统上)
窗口。在客户端打开(路由)
-并通过此路由在服务器端生成适当的pdf。有趣的是,您的评论让我找到了答案,我将尝试一下:啊,是的,您还必须在服务器端输出pdf,而不是@Musa notiedthank的json。谢谢解决方案,我曾多次尝试使用ajax,但由于PHP到Javascript之间的一些解码和编码问题,它无法工作。所以最终我决定按照您的建议使用完整的http请求,现在它可以工作了。再次感谢!
<a href="/path/to/download/1" target="_blank">Click view PDF</a>