【问题标题】:Upload naming convention上传命名约定
【发布时间】:2011-01-14 19:42:03
【问题描述】:

我正在创建一项调查,用户可以在其中上传大约 6 张图片。我将这些存储在文件系统中的最佳方式是什么?用户可以进行多项调查(从而随着时间的推移跟踪他们的改进)......所以这意味着我不能只是按顺序命名它们......

这是一个 CI/PHP 应用程序。 :)

或者为了知识,你会怎么做?

【问题讨论】:

  • 为什么不按顺序排列? survey1_image6.jpg?
  • 所以您需要跟踪、用户、调查和图像?
  • @Phill,我只需要一种简单的方法来跟踪图像和用户,但我不能将它们命名为 user12_image3...
  • @Pekka,如果你回答,我会给你绿色支票。你的回答对我来说是最简单的......
  • /images/{survet_id}/{timestamp}_{id}.{ext} 其中 id 将是 1/2/3 等,然后您执行 glob("/images/$survey_id/*_(1,2,3,4,5,6).(gif,png)") 并能够整齐地获取文件。

标签: php codeigniter logistics


【解决方案1】:

哇,这有点开放式......我想我可能会为每个用户构建一个目录,然后根据上传的日期时间命名图像。所以它看起来像这样:

/+
 |
 +--+ Kyle
    |
    +-- 20110113114903.png
    |
    +-- 20110113115122.png
    |
    +-- 20110114010304.png
 +--+ Kevin
    |
    +-- 20101114123456.png
    |
    +-- 20110102023648.png
    |
    +-- ...

但是,这可能不像您喜欢的那样可扩展。您可能希望使目录更深,以便每个人在每个日期都有一个目录,其中包含图像。

【讨论】:

  • 不错...我可以挖掘日期戳的想法。
【解决方案2】:

将数据库中的所有这些内容映射到您将它们存储在文件系统中的位置将是可搜索调查和用户的最佳结果。

// 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

【讨论】:

    【解决方案3】:

    考虑顺序编号:

    user123_survey1_image6.jpg
    

    用户的ID是123,这是用户的第六张图片,或者更简单:

    user123_survey56_image899.jpg
    

    用户123的第六张图片的ID恰好是899

    【讨论】:

    • 这对于蜜蜂来说感觉组织得不好,关于目录 IMO 应该有一些结构。
    【解决方案4】:

    如果您按照“因此随着时间的推移跟踪他们的改进”的建议跟踪单个用户,我会从顶级目录开始。然而,随着用户数量的增加,即使这样也会导致目录膨胀。

    在我编写的一个应用程序中,我必须为系统中的每个用户创建一个文件,我编写了一个例程(实际上是数据库端),将他们的唯一 ID 分解为一组结构化的文件夹。

    例如:用户 12345 上传 #5 可以存储在 UPLOAD_DIR/1/2/3/4/5/upload_5.png

    如果你想要一些不太“可猜测”的东西,你仍然可以使用类似上面的东西,但不仅仅是使用他们的 id,你可以散列它,但遵循类似的模式。

    【讨论】:

      【解决方案5】:

      另一种方法是使用 uniqid() 随机命名您的文件。当然,您必须检查以确保该 uniqid 不存在。像这样。

      do {
          $filename = uniqid().'.jpg';
      } while (file_exists('images/'.$filename));
      

      【讨论】:

      • 这假设您将文件名保存在数据库中。
      • 这也是糟糕的代码...除非您在do 部分添加文件创建...否则您将永远迭代...应该是while (file_exists('images/'.$filename))
      • @JohnCullen 你是对的。我已经编辑了答案以反映这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2011-02-22
      • 2011-02-07
      • 2012-02-08
      • 2011-09-01
      • 2011-02-04
      • 2013-10-16
      相关资源
      最近更新 更多