将图像存储在目录中,并存储对数据库中图像的引用

时间:2014-02-25 23:11:53

标签: php mysql image

我目前参与了一个项目,旨在创建一个网站,允许用户分享和评价图像,以用于他们的创意媒体课程。

我正在尝试找到将图像保存到mysql数据库的方法。我知道我可以将图像保存为blob,但这不会起作用,因为我计划只允许用户保存高分辨率图像。因此,我试图找出如何将图像存储在目录/服务器文件夹中,并存储对数据库中图像的引用。更重要的是,引用必须自动保存在mysql数据库表中。

有谁知道如何解决这个问题?或指出我正确的方向?

谢谢!

1 个答案:

答案 0 :(得分:11)

我实际上已经建立了一个类似的网站(大规模图像上传器),所以我可以从经验中说出来。

跟踪文件

将映像文件按原样保存在磁盘上,并将路径保存到数据库中的文件中。这部分应该非常简单。

一个缺点是您需要为每个图像查找数据库,但如果您的表格已经过优化(索引),这应该不是真正的问题。

有许多优点,例如您的文件很容易引用,您可以将元数据添加到文件中(例如视图数量)。

文件名

现在,保存文件,大量文件并不是一件容易的事。

如果您根本不关心文件名,只需生成一个随机哈希,如:

$filename = md5(uniqid()); // generate a random hash, mileage may vary

这可以解决所有类型的文件名相关问题,例如重复的文件名,不支持的字符等。

如果要保留文件名,请将文件名存储在数据库中。

如果你希望你的磁盘上的文件名也有点人性化,我会选择混合方法:部分哈希,部分原始文件名。您需要过滤不受支持的字符(例如/),并可能音译相似的字符(例如é -> eß -> ss)。中文和希伯来语等外语可以提供有趣的结果,因此请注意这一点。您还可以编码任何外来字符(如base64_encode),但这对可读性没有太大作用。

最后,请注意文件路径长度限制。文件名和文件路径不能无限长。我相信Windows的完整路径是255。

吊桶

你绝对应该考虑使用存储桶,因为操作系统(和人类)不喜欢包含数千个文件的文件夹。

如果您正在使用哈希,那么您已经拥有了方便的存储桶方案。

如果您的哈希为0aa1ea9a5a04b78d4581dd6d17742627

您的水桶可以是:0/a/a/1/e/a9a5a04b78d4581dd6d17742627。在这种情况下,有5个嵌套桶。这意味着在16 ^ 5(~1百万)个文件之后,您可以在每个存储桶中拥有一个文件。您需要多少级别的存储桶取决于您。

Mime类型

跟踪原始文件扩展名/ mime-type也很好。如果你只有一种mime类型(如TIFF),那么你不必担心它。大多数文件都有一些方法可以轻松检测到它是该格式的文件,但您不必依赖它。 PNG以PNG开头(使用文本编辑器打开它以查看它)。

相对路径与绝对路径

我还建议保存文件的相对路径,而不是绝对路径。这使维护变得更加容易。

所以保存:

0/a/a/1/e/a9a5a04b78d4581dd6d17742627

而不是:

/var/www/wwwdata/images/0/a/a/1/e/a9a5a04b78d4581dd6d17742627