Какова наилучшая практика хранения изображений для галереи? - PullRequest
9 голосов
/ 25 января 2012

Мой вопрос не о хранении изображений на диске или в БД.

  • Изображения будут сохранены на диске
  • Путь к изображению и другие данные изображения будут сохранены в базе данных.
  • изображениям будет присвоено уникальное имя файла
  • Изображения будут сохранены в 3 размерах
  • Со временем может быть много изображений, используемых многими пользователями

Мои вопросы:
- Должны ли изображения храниться в одной папке или во многих папках?
Нормально использовать md5 для создания уникальных идентификаторов? Например. md5 (идентификатор + имя файла + random_num)
- Должны ли изображения кэшироваться на сервере или в клиентском браузере / компьютере?

Что-нибудь еще, о чем я должен подумать?

Решение использует php, apache и mysql. Мы используем Uploadify для загрузки изображений.

Какой-то код, который я использую сегодня

  /**
   * Calculate dir tree for object
   * Folders starts from 00 to FF (HEX) and can have just as
   * many subfolders (I think :)
   * @param $id - User ID
   * @param $type - Image category
   * @return string
   */
  function calculateDirTree($id, $type)
  {
      $hashUserID   = substr(hash('md5', $id), -4);
      $parentFolder = substr($hashUserID,0,2);
      $subfolder    = substr($hashUserID,2);    
      $basePath     = $type."/".$parentFolder.'/'.$subfolder.'/';

      return $basePath;
  }  

Ответы [ 5 ]

3 голосов
/ 25 января 2012

Должны ли изображения храниться в одной папке или во многих папках?

Вы говорите о "изображениях от 100 до 200 тыс.", Поэтому необходимо иметь много папок.Попробуй иметь макс.В папке ~ 1000 изображений.

Можно ли использовать md5 для создания уникальных идентификаторов?Например, md5 (id + имя файла + random_num)

Да, вы можете сделать это.Это позволит избежать проблем с длинными именами файлов.

Следует ли кэшировать изображения на сервере или в клиентском браузере / компьютере?

Кэшировать на стороне клиентаПроблема с таким количеством изображений в том, что он создает большой трафик.Кэширование на клиенте помогает уменьшить это.

3 голосов
/ 25 января 2012

В зависимости от количества изображений, которые вы хотите обработать, я настоятельно рекомендую использовать несколько папок.Самый простой способ - использовать первую букву имени файла для создания структуры папок.Я думаю, цифры примерно такие:

less than 1000 images  --> one folder
less than 20000 images --> one level of folders (a, b, c, ...)
more                   --> several levels (a containing aa, ab, b containing ba, bb, ...)

ГММВ

0 голосов
/ 25 января 2012

определенно подходит для файловой системы: она более производительна и лучше подходит для хранения файлов (для этого и создана). Sql может замедляться при сохранении / получении больших изображений. Вы можете создать папку для каждого пользователя (используя идентификатор в качестве имени папки), и когда изображение сохраняется в файловой системе, вы можете сохранить ссылку в таблице UserImages (сохраняя имя файла для пользователя в sql). Вы можете убедиться, что каждое изображение получило уникальное имя файла, переименовав его при сохранении, вы можете использовать комбинацию исходного имени файла с фактическим DateTime (не нужно использовать MD5). Кроме того, изображения всегда должны кэшироваться, чтобы сохранить ваши и клиентов в полосе.

0 голосов
/ 25 января 2012

Я думаю, использование нескольких папок или одной папки зависит от вашего веб-приложения.Например, если есть несколько профилей, в каждом из которых есть несколько изображений, вы можете использовать несколько папок, используя имена папок в качестве имен профилей.

Мой последний совет: если у вас есть тонны изображений, алгоритм шифрования sha256 лучше для предотвращения столкновения

0 голосов
/ 25 января 2012

Что касается кэширования, было бы лучше кэшировать его с обеих сторон, чтобы новые изображения быстро извлекались, а пользователи, посещающие существующие изображения, кэшировали его.относительно хранения их в одной или нескольких папках.

...