"The Response callback must not be null" 尝试在 Laravel 7 中发送 PDF 文件下载时

"The Response callback must not be null" when trying to send a PDF file download in Laravel 7

在我的 Laravel 7 应用程序中,我有一个动态生成 PDF 的路径,我希望浏览器将其视为文件下载。

在撰写本文时,我发现了一些关于 Laravel 使用保存在文件系统上的文件提供文件下载服务的文档和问题,但就我而言,我不想将 pdf 存储在文件系统。我只是想在用户点击路由的时候动态生成,然后浏览器下载pdf。

我正在使用 mpdf 库,它似乎可以正确地形成 pdf 文件。但是,Laravel 抛出 The Response callback must not be null LogicException。在浏览器中,我看到显示了 PDF 的数据,然后是异常堆栈跟踪。

控制器方法如下:

public function pdf($id) {
    $manual = new \App\manual($id);
    $contents = view('admin.manual')->with($manual)->render();
    $mpdf = New \Mpdf\Mpdf();
    $mpdf->WriteHtml($contents);
    $pdf = $mpdf->output();
    return response()->streamDownload($pdf, 'manual.pdf');
}

在此屏幕截图中,您可以看到 PDF 文件的数据,它告诉我它正在生成和交付:

但是异常发生在PDF对象的EOF之后:

我从 Symfony 找到了 this 5-year-old issue 相同的异常消息,但似乎早就解决了。我没有发现与 Laravel 7.

有关的任何其他内容

如何在 Laravel 7 中正确指定数据的 pdf 文件下载?

我能够通过使用宏并指定 headers 来获得所需的行为。

    return response()->streamDownload(
            function() use ($pdf) { echo $pdf; } ,
            'manual.pdf',
            ['Content-type'=>'application/pdf']
    );

我一直在努力解决同样的问题,并使用上面的 post 解决了它。但是在 Lumen 8 中,我需要将 streamDownload 更改为流。

这是我的代码:

$stream = $mpdf->Output($filename, "I");
return response()->stream(function() use ($stream) { echo $stream; }, 200, ['Content-type'=>'application/pdf']);