【发布时间】:2016-02-25 06:21:13
【问题描述】:
我正在尝试使用 BLOB 将文件保存在数据库中。我知道这不是一个很好的做法,但需要这样做。
无论如何,我面临的问题是返回的 PDF 文件不再可读。但是从 blob 转换回来的所有其他文件(如 docx、odt、txt、jpg 等)都可以正常工作。
public function store(Request $request)
{
$data = $request->all();
$file = $request->file('file');
$data['data'] = base64_encode(file_get_contents($file));
$data['extension'] = $file->guessExtension();
$data['name'] = $file->getClientOriginalName();
$file = $this->fileRepo->create($data);
return jsend()->success()
->message("Resource Created Successfully")
->data($file->toArray())
->get();
}
public function download($id)
{
$file = $this->fileRepo->find($id);
$randomDir = md5(time() . $file->id . $file->user->id . str_random());
mkdir(public_path() . '/files/' . $randomDir);
$path = public_path() . '/files/' . $randomDir . '/' . html_entity_decode($file->name);
file_put_contents($path, base64_decode($file->data));
header('Content-Description: File Transfer');
return response()->download($path);
}
我哪里出错了,有没有一种特殊的方法可以将 PDF 存储在 blob 字段中?
【问题讨论】:
-
也许 cmets here 帮忙?
-
据我所知,那个家伙使用 3rd 方库将其编码为长度为 72 的行,但我不确定如何在我的应用程序中执行此操作。如何使用一定长度的行在php中对base64中的文件进行编码?
-
上传前和下载后的文件有何不同?类似
diff before.pdf after.pdf. -
@AlexBlex 是的,这两个文件有很大的不同。 Git没有显示太多。它说
index 1e5308a..a6a4f0b 100644,我不确定它是什么意思。但是我查看了文件,无论最初是 2 MB 还是 3 MB,返回的文件都像 786.4 kB。但是 phpmyadmin 显示所有 2/3 MB 都已存储。所以我猜当文件从数据库中返回时,其中一些被撕掉了? -
@Rohan,你确定它是 BLOB 吗? AFAIK Mysql 的 BLOB 限制为 64kB。
标签: php laravel pdf laravel-5 base64