使用Laravel

时间:2018-07-21 15:53:21

标签: php laravel postgresql pdf

我有一个项目,需要我将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


我试图通过关键字“上载并显示存储在PostgreSQL数据库中的PDF文件”浏览stackoverflow和其他问答网站上的许多问题来找到解决方案,但是不幸的是,我找不到如何解决该问题的答案。显示PDF文件。

我在YouTube(Insert File into MySQL Blob with PHP)上找到了一个视频,但是尝试后仍然没有运气。

我的问题是,如何使用Laravel 5.6框架在浏览器上的PostgreSQL数据库中显示/下载已保存的PDF文件?

================================================ ==================

我根据Devon的建议修改了showPDF函数,但是得到了以下输出:

latest output

这是修改后的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);
}

2 个答案:

答案 0 :(得分:0)

如今,大多数浏览器都内置了PDF阅读器,除非您希望将PDF实际上嵌入其他内容中,否则通常没有理由使用embed。

为此,您应该只能够从控制器返回响应,并为Content-Type设置标题:

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

答案 1 :(得分:0)

尝试几种组合后,我找到了解决方案。这是我的解决方案:

迁移文件:

Schema::create('uploads', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('mime');
        $table->text('data');
        $table->timestamps();
});

我在迁移文件中所做的更改是更改了列数据的数据类型,之前我使用了 binary ,在这里我使用了 text

我的控制器中用于上传PDF文件的功能:

public function upload()
{
    $name = $_FILES['fpdf']['name'];
    $mime = $_FILES['fpdf']['type'];
    $content = base64_encode(file_get_contents($_FILES['fpdf'['tmp_name']));

    $up = new Upload;

    $up->name = $name;
    $up->mime = $mime;
    $up->content = $content;

    $up->save();

    return redirect('upload');
}

我使用 base64_encode()函数对PDF文件进行编码。这是显示PDF文件的方法:

public function showPDF($id)
{
    $pdf = Upload::find($id);

    $content = base64_decode($pdf->content);
    return response($content)->header('Content-Type', $pdf->mime); // thanks to Devon
}

查看文件:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
    <meta charset="utf-8">
    <title>Demo Upload</title>
</head>
<body>
    <h1>Form Upload PDF File</h1>

    <form action="upload" method="post" enctype="multipart/form-data">
        @csrf

        <br>
        <input type="file" name="fpdf">
        <br> <br>
        <input type="submit" value="Upload">
    </form>

    <p>&nbsp;</p>

    <h3>List of PDFs</h3>

    @foreach($pdfs as $row)
        <a href="show/{{ $row->id }}" target="_blank"> {{ $row->name }} </a>
        <br>
    @endforeach
</body>
</html>

这是我目前的解决方案。我知道这可能不是处理文件上传的最佳方法,但是它可以工作。欢迎提出任何使代码更好和更安全的建议。