我最近开始开发一个非常庞大的网站。 在网站上我想允许用户上传他们的样本作品。 目前我们非常有限,因此图像将存储在我们的服务器上。
我对逻辑有点困惑。 所以我的逻辑就是这样。
用户创建一个文件夹,其名称存储在数据库中,并附加users id
文件夹表
行
id | folder | user_id
1 | Some folder | 1
2 | New folder | 4
3 | Nother folder | 7
图片表
行
id | image_name | folder_id |
1 | image1.jpg | 1
2 | image2.jpg | 1
3 | image3.jpg | 1
4 | image4.jpg | 2
5 | image5.jpg | 2
6 | image6.jpg | 2
关系
class Folder extends Eloquent
{
public function images()
{
return static::has_many('Images');
}
}
class Image extends Eloquent
{
public function folder()
{
return static::belongs_to('Folder');
}
}
服务器上的文件夹结构
- samples
-user_id
- folder_id
- image1
- image2
- image3
如您所见,用户创建了一个文件夹,在创建文件夹后,user
将图像名称上传到包含folders id
的数据库,并显示图像将是描述的方式以上是有关的。
所以我的问题。
我最神圣的是两件事。
我认为这将导致一个巨大的数据库,第二个是id's
,在x时间之后会有更多用户,id's
会增加,我知道这听起来很奇怪,但是因为很多用户会上传图片会导致巨大的id,我的意思是它可能达到数百万,有没有办法解决这个问题?
感谢您的帮助
答案 0 :(得分:19)
好的 - 让我们将其分解为几个子答案;
<强>问题:强>
- Is this a good logic in your opinion
- Can this lead problems in the future
- What would you offer for this functionality
<强>答案:强>
逻辑似乎听起来 - 但我很好奇 你将存储图像?在public_html里面 - 或者在web根目录之外?如果你在public_html中有图像 - 并允许浏览器直接访问它们,它将允许用户“猜测”其他用户文件夹并访问它们。您需要安全地存储数据。
要在webroot外部制作图像,并确保只有授权用户才能访问它们 - 您应该使用readfile()。像这样的东西可以解决这个问题
function user_file($file_name = "")
{
if ($file_name)
{
// Ensure no funny business names to prevent directory transversal etc.
$file_name = str_replace ('..', '', $file_name);
$file_name = str_replace ('/', '', $file_name);
// now do the logic to check user is logged in
if (Auth::check())
{
// Serve file via readfile() - we hard code the user_ID - so they
// can only get to their own images
readfile('../your_app/samples/'.Auth::user()->id.'/'.$file);
}
}
}
<强>问题:强>
我认为这会导致一个巨大的数据库,第二个是id的,在x时间之后会有更多用户,id会增加,而且我知道这听起来很奇怪,但是因为很多用户会上传图片导致巨大的id,我的意思是它可能达到数百万
<强>答案:强>
我们将MySQL服务器与包含5000万条记录的数据库结合使用。我们也知道使用MySQL服务器的用户有200,000个表和大约5,000,000,000行。
这就是50亿行。你可能会达到几百万。所以你在这里安全(取决于你的硬件)。
<强>问题:强>
...但是由于很多用户上传图片会导致巨大的身份, 我的意思是它可能达到数百万,是否有办法 解决这个问题?
<强>答案:强>
如果您不想存储数百万条记录,并且您担心性能,一个选项是保留文件夹表,但删除图像表。相反,您可以在文件夹上使用scandir() - 并让PHP从目录本身检索文件名。那么你没有那么多的开销。
<?php
$list_of_user_files = scandir("$user_id/$folder_id");
foreach ($list_of_user_files as $file) {
echo "File: $file <br>";
}
?>
答案 1 :(得分:1)
存储文件夹表并使用scandir函数的元数据是一个标准过程。并允许php从文件夹中检索文件名。如果你有许多文件,那么尝试按年份和月份顺序对它们进行分类,就像在wordpress中一样。 像
2012
01
02
03
2013
01
02
03
等文件夹内的id。因此,文件夹中的图像总数将相对较少。