Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 数据库设计和图像文件系统管理?_Php_Mysql_Image Processing_Image Management - Fatal编程技术网

Php 数据库设计和图像文件系统管理?

Php 数据库设计和图像文件系统管理?,php,mysql,image-processing,image-management,Php,Mysql,Image Processing,Image Management,我正在寻找建立一个后端,用于接受用户上传的图像,重命名它们并将它们存储在文件系统中(不,它不是Instagram) 我想简单地重命名图像并将其存储在用户文件夹中: images/{userid}/{userid}{md5(timestamp)}.jpg 这些协会也将包括在数据库中 这是一个好的/足够的模型吗?基本上,你的方法很好,但以下是我给你的建议: 不要在文件名中使用时间戳,因为您已经在数据库中存储了文件名,只需为时间戳创建额外的列即可 文件关系。这样更容易管理像“原创”这样的东西 创建、

我正在寻找建立一个后端,用于接受用户上传的图像,重命名它们并将它们存储在文件系统中(不,它不是Instagram)

我想简单地重命名图像并将其存储在用户文件夹中:

images/{userid}/{userid}{md5(timestamp)}.jpg

这些协会也将包括在数据库中


这是一个好的/足够的模型吗?

基本上,你的方法很好,但以下是我给你的建议:

  • 不要在文件名中使用时间戳,因为您已经在数据库中存储了文件名,只需为时间戳创建额外的列即可 文件关系。这样更容易管理像“原创”这样的东西 创建、上次修改,甚至过期日期
  • 确保存储文件名的列是唯一的。您不希望意外地存储重复的文件名
  • 在接受文件时进行交叉检查。如果文件已成功保存到服务器,但查询失败,请确保删除 失败时存档。或者,如果操作顺序颠倒,请删除 如果文件未能保存到服务器,则数据库中的条目
  • 如果不允许公开访问这些图像,您可以拒绝正常查看这些图像,而是将用户引导到 将文件名作为GET变量链接(PHP文件)。那你可以 检查会话和/或cookie,以确定它们是否被授权 查看它。如果是,您可以将输出的标题设置为 jpeg或他们正在查看的任何类型的文件

为什么不使用数据库中的唯一id,这样可以更轻松地查找文件

此外,它并不限制您如何构造文件,也许您并不总是希望按用户名保存,如果每个文件都有一个绑定到数据库的ID,这可能会简单得多

user/{database_id}.jpg
这取决于:

  • 每个用户有多少个图像
  • 每个图像的大约尺寸范围
  • 有多少用户
  • 您期望什么样的并发性
如果上面的大多数数字都很小,那么你的方法可能会很好,可以让你走很长的路,至少可以让你开始

我知道使用MySQL blob存储会得到一些好处,但这也是一种简单的入门方法,您可以切分数据库以获得一些扩展,而无需进行任何巧妙的编码

也就是说

如果在您的系统中,您希望用户上载大量文件,您可能会在文件系统中遇到这些文件

如果您在Windows上托管,请注意(当目录变大时速度会非常慢),因为您的文件名肯定会超过8.3:)

如果有很多人同时上传/下载(比如在使用高峰期),那么您必须注意I/O争用。如果您使用的是RAID 10卷,那么使用SSD会更进一步、更好(但可能会出现存储容量问题)

如果有可能不同的人上传相同的图像(在多个文件夹中重复),那么您建议的方法将不会是最节省空间的方法,在这种情况下,您最好使用数据功能(例如md5sum)键入并只存储一个副本(是的,那么删除时会出现管理问题)

如果您希望从许多人那里获得大量大型图像,那么最终您将不得不考虑扩展底层存储。您可以通过{userid}的某个函数将数据分区,并在不同的卷或机器上进行切分。这也会为您购买更好的并发吞吐量


另一个问题:你会一直只提供原始图像,还是有时会发回重新缩放的副本?您可能希望缩放一次并始终返回预缩放的版本,在这种情况下,您还需要考虑这些缩放副本的存储。

好/足够的模型用于什么?我认为使用时间戳存储文件名是一种很好的做法,因为它将使所有文件名都是唯一的。这是真的,但我想我想说的是,不要依赖它们来获得准确的时间戳。但是我想如果它们是md5的话,你无论如何也不能:P无论如何,使用rand()生成随机字符串比md5(time())性能更好我会使用timestamp而不使用md5()在任何情况下都是唯一的。在流量足够大的网站上,时间戳不一定是唯一的。@TobyAllen感谢您指出这一点。我没有想到。我真的不想让人们通过1.jpg,2.jpg etcOk轻松访问整个图像库,然后生成一个GUID,将其放入数据库并在其后调用文件名,同样的结果也会减少安全问题。