将 base64 编码的图像存储在数据库中是否明智


Is it wise to store base64 encoded images inside a database?

我正在制作一个Android应用程序,它可以拍摄照片并将图像(作为base64编码字符串)推送到PHP脚本,从这里我将有关图像的数据存储在MySQL数据库中。

将图像存储在

数据库中是否明智(因为它作为 base64 字符串传递),将其转换回图像并将其存储在文件系统上会更好吗?

base64 编码的图像占用太多位置(比二进制等效图像多约 33%)。

MySQL提供二进制格式(BLOB,MEDIUM_BLOB),使用它们。

或者,大多数人更喜欢在数据库中只存储文件系统将更有效地存储的文件的键,特别是如果它是一个大图像。这是我长期喜欢的解决方案。我通常使用文件内容的 SHA1 哈希来形成文件的路径,这样我就没有双重存储,并且如果需要,可以轻松地从文件中检索记录(我使用三级文件树,前两级分别从前两个字符以及哈希的字符 3 和 4 组成,这样我就不会有太多的直接子级的目录)。请注意,例如,这是 git 存储的逻辑。

将它们存储在数据库中的优点是,您可以更轻松地管理备份,尤其是只要您的项目很小。数据库会为你提供一个缓存,但你的服务器和客户端也是如此,很难先验地决定哪个是最快的,差异不会很大(我想你不会做太多的并发写入)。

我已经做到了两种方式,每次我回到在 MySQL 表中存储二进制数据的代码时,我总是使用 MySQL 表中的指针将其切换到文件系统。

在性能方面,你会更好地使用FS,因为从MySQL服务器中提取多个大型BLOB往往会迅速使其管道饱和。通常它是您不想堵塞的管道。

您始终可以将base64_encode($image)保存在文件中,并且仅将文件路径存储在数据库中,然后使用 fopen() 获取编码的图像。

如果我没有正确理解这个问题,我深表歉意。

我认为

"明智"是相当主观的。 我认为从"防止人们直接链接到我的图像"的角度来看,这是明智的。 此外,如果您决定需要更改目录结构等,这可能会有所帮助。这可能会让你更容易(但这实际上取决于你如何开始编写脚本......)但除此之外......随便说一下,我真的想不出这样做有什么好处。