【问题标题】:Store images in directories and store a reference to the images in the database将图像存储在目录中,并将对图像的引用存储在数据库中
【发布时间】:2014-03-28 12:08:49
【问题描述】:

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

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

有谁知道该怎么做?或者指出我正确的方向?

谢谢!

【问题讨论】:

    标签: php mysql image


    【解决方案1】:

    我实际上已经建立了一个类似的网站(大量图片上传器),所以我可以根据经验说话。

    跟踪文件

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

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

    有很多优点,例如您的文件易于引用,并且您可以将元数据添加到您的文件中(例如查看次数)。

    文件名

    现在,保存文件,大量文件,并不是一蹴而就的。

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

    $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(约 100 万)个文件之后,您可以期望在每个存储桶中有 一个 文件。您需要多少级别的存储桶取决于您。

    哑剧类型

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

    相对路径与绝对路径

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

    所以保存:

    0/a/a/1/e/a9a5a04b78d4581dd6d17742627
    

    代替:

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

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2019-05-07
      • 2017-07-24
      • 2011-04-15
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多