首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Laravel上传和显示保存在PostgreSQL中的PDF文件

使用Laravel上传和显示保存在PostgreSQL中的PDF文件
EN

Stack Overflow用户
提问于 2018-07-21 15:53:20
回答 2查看 3.1K关注 0票数 2

我有一个项目,要求在数据库中保存一个文件(实际上是将文件保存在DB中,而不是路径中)。我使用的是PostgreSQL 10和Laravel5.6。这是我的迁移文件:

代码语言:javascript
复制
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文件的功能:

代码语言:javascript
复制
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文件:结果在pgAdmin中显示

但是问题是,PDF文件不能在浏览器中显示(下载)。--这是我的控制器中用来在浏览器中显示PDF文件的函数:

代码语言:javascript
复制
public function showPDF($id)
{
  $pdf = Upload::find($id);
  return view('upload/pdf', compact('pdf'));
}

视图文件:

代码语言:javascript
复制
<?php
    $content = pg_unescape_bytea(stream_get_contents($pdf->data));
    echo "<embed src='data:". $pdf->mime .";base64,".base64_encode($content)."' />";
?>

输出是:用于在浏览器中显示PDF文件的输出

我试图通过浏览堆栈溢出和其他带有关键字“PostgreSQL DB中存储的PDF文件的上传和显示”关键字的问答网站来找到解决方案,但不幸的是,我没有找到任何关于如何显示PDF文件的答案。

我在YouTube (用PHP将文件插入MySQL块中)上找到了一段视频,但在尝试之后,仍然没有任何进展。

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

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

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

这是修改后的showPDF函数:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

发布于 2018-07-21 16:30:29

现在大多数浏览器都内置了PDF阅读器,除非你真的想在其他内容中嵌入PDF,否则通常没有理由使用embed。

为此,您应该能够返回来自控制器的响应,并为Content设置头部:

代码语言:javascript
复制
return response($content)->header('Content-Type', $pdf->mime);
票数 0
EN

Stack Overflow用户

发布于 2018-07-24 13:23:02

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

迁移文件:

代码语言:javascript
复制
Schema::create('uploads', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('mime');
        $table->text('data');
        $table->timestamps();
});

我在迁移文件中所做的是更改列数据的数据类型,以前我使用二进制,这里我使用text

函数在我的控制器中上传PDF文件:

代码语言:javascript
复制
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文件的方法:

代码语言:javascript
复制
public function showPDF($id)
{
    $pdf = Upload::find($id);

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

查看文件:

代码语言:javascript
复制
<!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>

这是我现在的解决方案。我知道这可能不是处理文件上传的最好方法,但它有效。任何使代码更好和安全的建议都是受欢迎的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51457746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档