我有一个项目要求我在数据库中保存一个PDF文件(字面意思是将文件保存在DB中,而不是路径中)。我用的是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和其他问答网站上浏览这么多带有关键字“upload and display PDF file stored in the PostgreSQL DB”的问题来找到解决方案,但不幸的是,我找不到任何关于如何显示PDF文件的答案。
我在YouTube上找到了一个视频(Insert File into MySQL Blob with PHP),但在尝试之后,仍然没有运气。
我的问题是,如何使用Laravel 5.6框架在浏览器上显示/下载PostgreSQL数据库中保存的PDF文件?
==================================================================
我根据Devon的建议修改了showPDF函数,但得到了以下输出:
php - 使用Laravel上传并显示保存在PostgreSQL中的PDF文件-LMLPHP
这是修改后的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);
}

最佳答案

现在大多数浏览器都内置了PDF阅读器,除非你真的想将PDF嵌入到其他内容中,否则通常没有理由使用embed。
为此,您只需返回控制器的响应,并为内容类型设置标题即可:

return response($content)->header('Content-Type', $pdf->mime);

关于php - 使用Laravel上传并显示保存在PostgreSQL中的PDF文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51457746/

10-10 18:14
查看更多