Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL用户照片库的设计_Php_Mysql_Database Design_Gallery_Photo Gallery - Fatal编程技术网

Php MySQL用户照片库的设计

Php MySQL用户照片库的设计,php,mysql,database-design,gallery,photo-gallery,Php,Mysql,Database Design,Gallery,Photo Gallery,我正在为一个基本的照片库设计一个数据库,每个用户可以上传几个图像 现在我所拥有的是: 照片库 photo_id - image - sort_order - user_id 1 - test.jpg - 1 - 1 2 - another_photo.jpg - 2 - 1 然后在我的文件夹结构上创建一个新文件夹,如下所示: 图像/照片库/并将图像存储在其中。现在,我应该

我正在为一个基本的照片库设计一个数据库,每个用户可以上传几个图像

现在我所拥有的是:

照片库

photo_id -    image             - sort_order - user_id
1        -    test.jpg          - 1          - 1
2        -    another_photo.jpg - 2          - 1
然后在我的文件夹结构上创建一个新文件夹,如下所示: 图像/照片库/并将图像存储在其中。现在,我应该为每个用户id创建一个文件夹并将其特定的图像存储在该文件夹中吗/

因此,在这种情况下: images/photo gallery/1/test.jpg用户1的所有照片都会在那里吗

另外,为了重新调整大小,我正在考虑使用,以便只存储原始照片,如果我想将其调整为特定大小,我可以使用如下脚本调用它:/image.php?width=200&height=200&image=test.jpg

我应该散列这些文件名吗?我还缺什么吗?对如何改进这一点有什么建议吗

谢谢

现在,我是否应该为每个用户id创建一个文件夹,并将其特定的图像存储在该文件夹中

是的,以某种方式分开上传是个好主意,这样你就不会在一个目录中保存成千上万的文件。您可以按用户ID、首字母(例如images/t/te/test.jpg)或哈希(例如images/0e/0e4fab12.jpg)将它们分开


我应该散列这些文件名吗

这取决于你想完成什么。由于您计划在URL中引用文件名,因此使用一组已知的“安全”字符存储文件名可能是一个优势:

image.php?image=c/ca/cat%20farting%20On%20a%20lemon.jpg
 -- vs --
image.php?image=0a/0a1b2c3d.jpg
但是,如果您这样做,我建议扩展您的数据库架构以包括原始文件名:

photo_id | image           | orig_fn           | sort_order | user_id
1        | 0a/0a1b2c3d.jpg | charginLazors.jpg | 1          | 2

您还可以考虑存储有关图像的附加元数据,如上传日期、标题等。


关于文件夹结构,您可以使用文件名中任意数量的字符,但需要考虑以下几点:

使用创建十六进制文件名的哈希方法意味着子文件夹的最大数量将是16的倍数:

  • 一个字符-16个子文件夹
  • 两个字符-256个子文件夹
  • 三个字符-4096个子文件夹
如果您使用两个以上的字符,我建议将文件夹进一步嵌套:
0a/0a12/0a12bd31.jpg
-或-
0a/12/0a12bd31.jpg
。这使得导航/管理文件更易于管理(IMO)

请记住,使用的前缀字符越多,每个文件夹中的文件就越少。如果您希望高容量,可以选择使用更多文件夹,每个文件夹的文件数更少

现在,我应该为每个用户id创建一个文件夹吗

这是一个很好的解决方案,另一种可能是每年创建一个文件夹,最终每个月创建一个文件夹,具体取决于目标照片数量。 对于照片文件名,我建议使用数据库id,这样可以避免字符编码问题,并最终在数据库中保留原始名称

此外,为了重新调整大小,我正在考虑使用智能图像大小调整器

在我看来,除非你需要保留完整尺寸的图片,否则我建议你保存调整大小的照片。好处如下:您可以存储更多照片,可以更快地发送照片,照片导航将更具反应性

我还缺什么吗

嗯,也许是那种用户权限可以驱动你存储图像的方式

对如何改进这一点有什么建议吗


我研究了这些想法并创建了一个PhotoBlog,您可以发现它是开源的,所以请随意查看PHP和JavaScript源代码。

这是一个很好的答案。我只是想强调文件名/文件路径重复的可能性。如果用户可能会上载同名的图像,或者用户可能会上载相同的图像(如果您将文件名基于图像本身的散列),则需要确保首先检查重复(file_exists())并以某种方式进行处理。您还可以将mysql photo_id附加到文件的末尾(“'.photo_id”),以保持其唯一性,并可能在将来将其用作识别快捷方式。谢谢您的回答。只是几个问题。为了存储路径,最好将其存储为:0a/0a1b2c3d.jpg,而不是包含images文件夹,以防我更改它?在这种情况下,存储原始文件名会有什么好处?@Drew:很好。是的,最好将映像路径相对于映像根路径(可以在配置文件中设置)存储在数据库中。我将修改答案。关于原始文件名,这实际上取决于库的用途。如果用户可以查看图像的原始文件名(或者使用图像的原始名称而不是看似随机的名称下载图像),请将其包括在内。如果文件名不相关,请跳过它。这就是构建您自己的系统的美妙之处:您可以使它完全适合您的预期用途。好的,太棒了,谢谢!还有最后一个问题。我会创建一个PHP脚本,将文件重新命名为散列,并自动抓取前两个字母,如果它不存在,为它创建一个文件夹?会不会有很多文件夹,因为如果它是随机生成的,每个文件与前一个文件具有相同的2个字母的几率很小?或者我误解了什么?是的,您将在上载处理程序中生成哈希,在图像路径上创建任何必要的文件夹,然后使用哈希文件名将其放在最终位置。我还更新了答案,更好地解释了文件夹结构的可能性。