Как я должен сохранить мои изображения в моем проекте? - PullRequest
1 голос
/ 08 апреля 2009

Это то, что я хочу сделать ............

Я собираюсь позволить каждому пользователю загружать несколько изображений в папку, которая называется "фото". Если пользователь загрузит сообщение «MyImage.jpg», я переименую его в «MyImage_UserID.jpg». Где UserID будет уникальным идентификатором пользователя, конечно. Таким образом, когда я ищу все изображения пользователя, я просто ищу имя изображения, которое заканчивается UserID.

Это неправильно, или есть другой способ сделать это?

Я думаю о размещении ВСЕХ изображений всех пользователей в 1 папку.

Будет глупо создавать папку для каждого пользователя, не правда ли?

Кроме того, как сохранить эту папку "фото" будет? Как я не хочу, чтобы хакеры добавляли или удаляли изображения из этой папки.

Любой ввод?

Ответы [ 6 ]

3 голосов
/ 08 апреля 2009

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

поэтому, когда мне приходилось хранить тысячи изображений, я всегда создавал 256 подкаталогов и сохранял файлы в каталоге files/{id mod 256}/{myfile_id}.jpg

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

1) так что ... обычные резервные копии. период.
2) файлы журнала аудита (кто что когда). это не безопасность как таковая, но она может помочь вам обнаружить дыры в безопасности и исправить ошибки
3) соответственно установите права доступа к файлу (важно на общих серверах без хромирования)
4) перепроверьте, действительно ли действие сделано правильным пользователем. Должно быть невозможно причинить вред, угадав URL.

есть еще кое-что, если вы хотите сделать секретными имена файлов и -paths. например можно напрямую не ссылаться на изображение, а на скрипт, который обслуживает это изображение. в этом случае вы можете хранить файлы вне webroot (кроме того, вы более независимы от имен файлов) (см. код в конце).

еще один шаг - избегать значений идентификатора auto_increment для идентификации изображений. Лучше использовать уникальный хэш (md5(mt_rand());) без корреляции с идентификатором и сохранить его в базе данных (afaik youtube и flickr делают это).

уродливый php-псевдокод для прохождения будет выглядеть примерно так:

<?php
  if (isset($_REQUEST['img'])) {
    $hash = $_REQUEST['img']);
    if (($res = getImageByHash($hash)) !== false) {
      list($id, $name, $mimetype) = $res;
      $path = '../images/' . ($id % 256) . '/' . $name;

      if (file_exists($path)) {
        header('Content-type: ' . $mimetype); // e.g. image/png
        readfile($path);
        exit();
      }
    }
  }

  // if any error happened, then 404 - it's dirty
  header("HTTP/1.0 404 Not Found");
  echo 'sorry, we couldn\'t find this image';
?>

getImageByHash () будет запрашивать БД. Это решение медленнее, поскольку веб-сервер больше не может напрямую обслуживать изображения.

и: я бы не хотел хранить изображения в базе данных. экспорт станет огромным, резервные копии - боль.

3 голосов
/ 08 апреля 2009

При условии, что будет значительное количество пользователей со значительным количеством изображений на пользователя, ваша файловая система начнет задыхаться (при условии, что она не потерпит крах, если не сможет обработать большое количество файлов).

Я рекомендую создать папку для каждого пользователя. И нет, это не глупо.

2 голосов
/ 08 апреля 2009

Не рекомендуется хранить все изображения в одном каталоге. Файловая система захлебнется, если в ней будет много узлов.

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

Люди обычно придумывают: разделить идентификатор пользователя:

+ 1
|- 11
|- 12
|- 1490
+ 2
|- 23
|- 240
...

Но тогда данные не распределяются равномерно через структуру каталогов, что приводит к другим проблемам.

Самым простым рабочим решением является разделение идентификатора пользователя сзади:

+ 1
|- 231
|- 91
|- 1
+ 2
|- 6322
|- 342
...

Но есть и лучшие решения.
См. Также: Как хранить изображения в вашей файловой системе для более сложного решения

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

  1. создать запись в БД, помеченную как «несинхронизированная»
  2. получить идентификатор новой вставленной записи
  3. хранить данные в файловой системе, привязанные к вновь вставленной записи. ID
  4. пометить запись как «синхронизированную»

Удаление вещей происходит наоборот.

1 голос
/ 08 апреля 2009

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

Есть и другие вещи, которые вы можете сделать - провести исследование безопасности сайта.

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

0 голосов
/ 23 июля 2009

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

1) Сохраняйте их в формате JPEG и сохраняйте изображения других типов в формате JPEG

2) Повторно сэмплируйте картинки, размер которых больше необходимого вам пикселя.

Существует специальный компонент AccessImagine, который может наблюдать за этим автоматически + дать пользователям свободу методов отправки изображений. Вы можете скачать его здесь - http://access.bukrek.net

0 голосов
/ 08 апреля 2009

просто имеет 1 отдельную папку, куда вы загружаете все фотографии, и отдельную таблицу, в которой регистрируются ИД пользователя и имя файла изображения

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

это если вы решили сохранить фото в файловой системе


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

Многие парни здесь спорят об этом. Тем не менее, обратите внимание, что sharepoint 2007 использует sql-сервер для сохранения документов, изображений и т. д., и даже если у вас много пользователей, и вам требуется балансировка нагрузки и откат, тогда это очень трудно достичь в файловой системе (вы будет вынужден полагаться на общий сетевой ресурс и реплицировать ваш общий сетевой ресурс для восстановления)

но та же задача, которую нужно выполнить с помощью сервера sql, будет проще простого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...