我有一个项目,需要我将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函数,但是得到了以下输出:
这是修改后的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);
}
答案 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> </p>
<h3>List of PDFs</h3>
@foreach($pdfs as $row)
<a href="show/{{ $row->id }}" target="_blank"> {{ $row->name }} </a>
<br>
@endforeach
</body>
</html>
这是我目前的解决方案。我知道这可能不是处理文件上传的最佳方法,但是它可以工作。欢迎提出任何使代码更好和更安全的建议。