我正在使用Laravel 5.8开发Web应用程序,这是Laravel框架的新手。当用户单击某些按钮时,我想在浏览器中显示PDF文档。我将允许经过身份验证的用户“查看”和“下载” PDF文档。
我已经创建了一个Controller和一个Route来显示文档。但是,我很困,因为我有很多文档,而且我不知道如何使用Laravel VIEW单独显示和下载每个文档。
/ * PDFController * /
public function view($id)
{
$file = storage_path('app/pdfs/') . $id . '.pdf';
if (file_exists($file)) {
$headers = [
'Content-Type' => 'application/pdf'
];
return response()->download($file, 'Test File', $headers, 'inline');
} else {
abort(404, 'File not found!');
}
}
}
/ 路线 /路线:: get('/ preview-pdf / {id}','PDFController @ view');
根据laravel docs:
文件方法可用于直接在用户的浏览器中显示文件,例如图像或PDF,而不是启动下载。
您需要做的就是将文件路径传递给方法:
return response()->file($pathToFile);
如果您需要自定义标题:
return response()->file($pathToFile, $headers);
Mateus的答案很好地描述了如何设置控制器功能以返回PDF文件。我会在您的/routes/web.php
文件中执行以下操作:
Route::get('/show-pdf/{id}', function($id) {
$file = YourFileModel::find($id);
return response()->file(storage_path($file->path));
})->name('show-pdf');
您的问题的另一部分是如何将PDF嵌入到*.blade.php
视图模板中。为此,我建议使用PDFObject。这是一个非常简单的PDF查看器JavaScript软件包,可轻松嵌入PDF。
如果使用npm
,则可以运行npm install pdfobject -S
安装此软件包。否则,您可以从CDN提供服务,也可以自己托管脚本。包含脚本后,您可以按以下步骤进行设置:
HTML:
<div id="pdf-viewer"></div>
JS:
<script>
PDFObject.embed("{{ route('show-pdf', ['id' => 1]) }}", "#pdf-viewer");
</script>
就这样-超级简单!而且,我认为,与导航到单独显示PDF的页面相比,它为您的用户提供了更好的UX。希望对您有所帮助!
UPDATE:在阅读完您对其他答案的评论后,我认为您可能会发现this example对于您尝试执行的操作特别有用。