我正在构建一个网站,并且刚刚开始开发后端。
我网站的重点是向访问者显示图像。出于开发目的,我想在上线之前先测试所有内容。
我想知道存储这些图像的最佳方式是什么。我刚刚完成 Wamp 服务器的设置,并使用 phpMyAdmin 添加了一个新数据库。我发现我可以将每个图像作为 BLOB 数据类型直接存储在 mySQL 数据库中。但这是最好的方法吗?
谢谢!
这肯定不是正确的方法。然后,您需要在 PHP 中将 blob 保留在内存中,然后再将其发送到浏览器。
更好的方法是将图像作为文件存储在文件系统中,并将文件名存储在数据库中。这样,您就可以将整个图像服务卸载到 Web 服务器,并且永远不会在文件的 HTTP 请求中涉及 PHP。
将文件存储到数据库有两个主要优点:
交易安全。如果用户编辑他的个人资料(照片和出生日期),则要么两者都被保存,要么两者都不保存,以防回滚/错误。
只有一个备份点。您不会忘记备份包含用户头像的目录。
但是,由于有很多陷阱,我不推荐它,尤其是不使用 PHP & MySQL。 MySQL 不支持流式传输,因此如果文件很大,您将耗尽所有内存。
文件系统无疑是最快、最自然的方式。它的开销最少,资源消耗也最少。
阅读:
您可以将它们存储在数据库中,然后轻松操作图像。例如,您可以从数据库中获取原始图像并创建多个不同大小的缓存图像(在磁盘上)(使用imagick),然后在网站中显示它们。如果你使用数据库,你应该在拍摄图像时使用延迟加载(仅在需要时加载内容),否则 mysql 将使你的服务器崩溃。 :)
您可以创建一个目录 /cache/pictures/$id_$width_$height.jpg 并将它们存储在那里。 仅当未找到 $id_$width_$height 时才创建新图像。
我个人不建议将文件存储在数据库本身中。我会存储对文件位置的引用,以便将来如果需要的话可以通过镜像等进行扩展。
通常,前端将图像转换为 blob 格式,从而生成一个字符串(blob URL)作为输入。该 blob 应暂时保留在本地存储中,直到任务或请求完成。一旦完成,应使用 Azure Blob 等服务将其永久存储在云中。 Azure Blob 等云服务提供的文件夹结构提高了可访问性。
图像保存在映射到用户 ID 的单独表中,以供小规模或私人用途。对于其他照片,可以将用户ID和要求组合起来创建唯一ID(例如,“home”+“userid”来保存用户的主页图片)。这种方法可以有效地组织和检索照片。