我有一个项目,要求在数据库中保存一个文件(实际上是将文件保存在DB中,而不是路径中)。我使用的是PostgreSQL 10和Laravel5.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文件:结果在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)."' />";
?>我试图通过浏览堆栈溢出和其他带有关键字“PostgreSQL DB中存储的PDF文件的上传和显示”关键字的问答网站来找到解决方案,但不幸的是,我没有找到任何关于如何显示PDF文件的答案。
我在YouTube (用PHP将文件插入MySQL块中)上找到了一段视频,但在尝试之后,仍然没有任何进展。
我的问题是,如何使用Laravel5.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);
}发布于 2018-07-21 16:30:29
现在大多数浏览器都内置了PDF阅读器,除非你真的想在其他内容中嵌入PDF,否则通常没有理由使用embed。
为此,您应该能够返回来自控制器的响应,并为Content设置头部:
return response($content)->header('Content-Type', $pdf->mime);发布于 2018-07-24 13:23:02
在尝试了几种组合之后,我找到了解决方案。我的解决方案是:
迁移文件:
Schema::create('uploads', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('mime');
$table->text('data');
$table->timestamps();
});我在迁移文件中所做的是更改列数据的数据类型,以前我使用二进制,这里我使用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>这是我现在的解决方案。我知道这可能不是处理文件上传的最好方法,但它有效。任何使代码更好和安全的建议都是受欢迎的。
https://stackoverflow.com/questions/51457746
复制相似问题