【问题标题】:Why people don't use sequential numbers for image storage?为什么人们不使用序列号来存储图像?
【发布时间】:2016-06-02 07:50:42
【问题描述】:

我一直在环顾四周,我发现,例如,instagram 使用大字符串来命名他们的图像(例如,instagram/p/BB-cCvtje4k),facebook 也是如此。将图片命名为 thisuser/1 和下一张图片 thisuser/2 等等有什么缺点吗?还是在我的服务器端代码上执行以下操作是不好的做法?

$i=1;
while(file_exists('thisuser/'.$i)) {
    i++;
}
$image_path = 'thisuser/'.$i;

谢谢!

【问题讨论】:

  • 最大的骗局....人们可以不断增加访问您网站上每张图片的数量,无论您是否愿意
  • 这很好。但我认为使用代码将图像设为私有比隐藏它的路径更安全。如果您不希望有人看到图像,只需使其对您希望的用户可用。脸书做到了。不确定Instagram是否会这样做,但我认为是的。所以我认为这不是他们不这样做的原因。
  • 我的评论不仅仅是“通过默默无闻的安全”,它是一种非常普遍的做法,只是为了消除尝试的诱惑;无论如何,您仍应始终在代码中进行验证
  • 使用 UUID 值还可以更轻松地合并数据库或将数据从一个数据库传输到另一个数据库,而顺序 pk 编号可能需要重置

标签: php database image server-side


【解决方案1】:

在 instagram 或 facebook 规模的网站上使用 10 位数字字符的缺点是 URL 可能太长了。请记住,Facebook 会收到类似每周 10 亿张新照片上传的数据。所以这是很多数字。使用类似 36 进制的字母表可能会减少字符数。在这种规模下,效率在多个方面都很重要。

但是,您可能没有考虑到这些 URL 背后有一个非常独特的设计以及它们的含义,它与顺序或非顺序数字无关。

例如,根据Facebook's white papers 之一在他们的在 Haystack 中寻找针:Facebook 的照片存储,他们指出 URL 是这样组成的 http://(CDN)/(Cache)/(Machine id)/(Logical volume, Photo),其中每个部分URL 代表了一个独特的物理/逻辑标识符,它指出了在照片存储机制中可以从中检索照片的位置。

当用户访问页面时,网络服务器使用目录 为每张照片构建一个 URL。网址 包含多条信息,每条对应 到用户的步骤顺序 浏览器联系 CDN(或缓存)以最终检索 商店中机器的照片。一个典型的 将浏览器定向到 CDN 的 URL 看起来像 下列的: http://(CDN)/(Cache)/(Machine id)/(Logical volume, Photo)

【讨论】:

  • 所以使用顺序命名没有强制性的缺点,他们只是使用他们的方式,因为它更适合他们?
  • 对,这种设计有助于他们唯一地识别其海量存储系统上的照片。当然,地球上很少有人会遇到像 facebook 这样的网站的问题或设计要求。如果您依赖 MySQL 数据库提供 AUTO_INCREMENT 值作为唯一标识存储系统上照片的 PK,那么这本质上没有任何问题。
【解决方案2】:

Sherif 的回答很好地描述了这个问题。简而言之,这完全取决于您的期望 - 总共或每天将有多少张图片,您是否会使用它们将其显示给用户。

例如,如果每天要上传大量图片,您可以将文件夹年/月/日/-image_name.img- 分开,其中 image-name 可以是随机的 uuid。 对于少量文件,并且当您不关心用户是否能够访问他不应该访问的图像时,序列号命名就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2014-09-20
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多