【发布时间】:2018-07-21 15:53:20
【问题描述】:
我有一个项目要求我在数据库中保存一个 PDF 文件(字面意思是将文件保存在数据库中,而不是路径)。我正在使用 PostgreSQL 10 和 Laravel 5.6。这是我的迁移文件:
public function up()
{
Schema::create('uploads', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('mime');
$table->binary('data'); // generate a bytea column after running migration
$table->timestamps();
});
}
以下是我的控制器中上传PDF文件的功能:
public function upload(Request $req)
{
$name = pg_escape_string($_FILES['fpdf']['name']);
$type = pg_escape_string($_FILES['fpdf']['type']);
$data = pg_escape_bytea(file_get_contents($_FILES['fpdf']['tmp_name']));
DB::table('uploads')
->insert(['name' => $name, 'mime' => $type, 'data' => $data]);
return "success upload";
}
PDF文件上传成功: Result showed in pgAdmin
但问题是,PDF 文件无法在浏览器中显示(下载)。这是我的控制器中的功能,用于在浏览器中显示 PDF 文件:
public function showPDF($id)
{
$pdf = Upload::find($id);
return view('upload/pdf', compact('pdf'));
}
视图文件:
<?php
$content = pg_unescape_bytea(stream_get_contents($pdf->data));
echo "<embed src='data:". $pdf->mime .";base64,".base64_encode($content)."' />";
?>
输出是: Output for displaying the PDF file in the browser
我试图通过在 stackoverflow 和其他问答网站上使用关键字“上传并显示存储在 PostgreSQL 数据库中的 PDF 文件”来浏览这么多问题来找到解决方案,但不幸的是我找不到任何关于如何解决的问题显示 PDF 文件。
我在 YouTube (Insert File into MySQL Blob with PHP) 上找到了一个视频,但尝试后仍然没有成功。
我的问题是,如何使用 Laravel 5.6 框架在浏览器上显示/下载 PostgreSQL 数据库中保存的 PDF 文件?
================================================ ====================
我根据 Devon 的建议修改了我的 showPDF 函数,但得到了以下输出:
这是修改后的 showPDF 函数:
public function showPDF($id)
{
$pdf = Upload::find($id);
$content = pg_unescape_bytea(stream_get_contents($pdf->data));
return response($content)->header('Content-Type', $pdf->mime);
}
【问题讨论】:
-
为什么要使用转义字符串函数?你真的想嵌入还是让他们下载?
-
嗨,Devon,我想做其中之一,但我更喜欢下载 PDF 文件。
-
你真的不应该将 pg_ 函数与 Laravel 结合起来。无论如何都不要使用转义字符串函数,即使在 Laravel 之外,您也应该使用准备好的语句。
标签: php laravel postgresql pdf