我正在创建一个用户可以上传大约 6 张图片的调查。我将这些存储在文件系统中的最佳方式是什么?用户可以进行多项调查(从而随着时间的推移跟踪他们的改进)......所以这意味着我不能只是按顺序命名它们......
这是一个 CI/PHP 应用程序。:)
或者为了知识,你会怎么做?
我正在创建一个用户可以上传大约 6 张图片的调查。我将这些存储在文件系统中的最佳方式是什么?用户可以进行多项调查(从而随着时间的推移跟踪他们的改进)......所以这意味着我不能只是按顺序命名它们......
这是一个 CI/PHP 应用程序。:)
或者为了知识,你会怎么做?
哇,这有点开放式......我想我可能会为每个用户构建一个目录,然后根据上传的日期时间命名图像。所以它看起来像这样:
/+
|
+--+ Kyle
|
+-- 20110113114903.png
|
+-- 20110113115122.png
|
+-- 20110114010304.png
+--+ Kevin
|
+-- 20101114123456.png
|
+-- 20110102023648.png
|
+-- ...
但是,这可能不像您喜欢的那样可扩展。您可能希望使目录更深,因此每个人每个日期都会获得一个目录,其中包含图像。
将数据库中的所有这些映射到您将它们存储在文件系统上的位置将是可搜索调查和用户的最佳结果。
// Pseudo Database
// user table
user_id (pk)
user_name
user_filesystem_dir
...
// survey table
survey_id (pk)
survey_name
survey_filesystem_dir
...
// Image table
image_id (pk)
image_name
image_filesystem_dir
user_id_fk (this is the user_id from the user table)
survey_id_fk (this is the survey_id from the survey table)
...
// Find all the images for user id 123 and survey 456
SELECT * FROM image_table AS it, user_table AS ut, survey_table AS st
JOIN (it.user_id_fk = ut.user_id AND it.survey_id_fk = st.survey_id)
WHERE user_id_fk = 123
AND survey_id_fk = 456
// Pseudo Code
$user_id = 123;
$survey_id = 456;
$survey_name = 'Stack Survey #1';
$image_array = array(
'image1.png',
'image2.png',
'image3.png',
'image4.png',
'image5.png',
'image6.png'
);
// Folder Structure where User is most searched
+-+123 <user_id>
|
+-467 <survey_id>
| |
| +-images
| |
| +-image1.jpg
| +-image2.jpg
| +-image3.jpg
+-456 <survey_id>
|
+-images
|
+-image1.png
+-image2.png
+-image3.png
+-image4.png
+-image5.png
+-image6.png
// Folder Structure where Survey is most searched
+-+467 <survey_id>
| |
| +-123 <user_id>
| |
| +-images
| |
| +-image1.jpg
| +-image2.jpg
| +-image3.jpg
+-456 <survey_id>
|
+-123 <user_id>
|
+-images
|
+-image1.png
+-image2.png
+-image3.png
+-image4.png
+-image5.png
+-image6.png
如果您按照“因此随着时间的推移跟踪他们的改进”的建议来跟踪单个用户,我将从顶级目录开始。然而,随着用户数量的增加,即使这样也可能导致目录膨胀。
在我编写的一个应用程序中,我必须为系统中的每个用户创建一个文件,我编写了一个例程(实际上是数据库端),将他们的唯一 ID 分解为一组结构化的文件夹。
例如:用户 12345 上传 #5 可以存储在 UPLOAD_DIR/1/2/3/4/5/upload_5.png
如果你想要一些不太“可猜测”的东西,你仍然可以使用类似上面的东西,但不仅仅是使用他们的 id,你可以散列它,但遵循类似的模式。
考虑顺序编号:
user123_survey1_image6.jpg
用户的 ID 是123
,这是用户的第六张图片,或者更简单:
user123_survey56_image899.jpg
其中用户123
的第六张图片恰好有 ID 899
。
一种替代方法是使用 uniqid() 随机命名您的文件。当然,您必须检查以确保该 uniqid 不存在。像这样的东西。
do {
$filename = uniqid().'.jpg';
} while (file_exists('images/'.$filename));