Масштабируемое хранилище изображений - PullRequest
52 голосов
/ 25 декабря 2009

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

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

  1. Используйте (распределенную) файловую систему, такую ​​как HDFS, и подготовьте выделенные веб-серверы в качестве «клиентов файловой системы» для сохранения загруженных изображений и запросов на обслуживание. Метаданные изображения сохраняются в дополнительной базе данных, включая информацию о пути к файлу для каждого изображения.

  2. Используйте систему, ориентированную на BigTable, например HBase, поверх HDFS и сохраняйте вместе изображения и метаданные. Опять же, веб-серверы блокируют загрузку изображений и запросы.

  3. Используйте полностью безсхемную базу данных, такую ​​как CouchDB, для хранения изображений и метаданных. Кроме того, используйте саму базу данных для загрузки и доставки с помощью API-интерфейса RESTful на основе HTTP. (Дополнительный вопрос: CouchDB сохраняет BLOB-объекты через Base64. Может ли он возвращать данные в виде изображений / JPEG и т. Д.)?

Ответы [ 11 ]

0 голосов
/ 30 ноября 2016

Вот пример для хранения изображения блоба в CouchDB с использованием PHP Laravel. В этом примере я храню три изображения в соответствии с требованиями пользователя.

Установление соединения в CouchDB.

$connection = DB::connection('your database name');

/*region Fetching the Uers Uploaded Images*/

$FirstImage = base64_encode(file_get_contents(Input::file('FirstImageInput')));
$SecondImage =base64_encode(file_get_contents(Input::file('SecondImageInput')));
$ThirdImage = base64_encode(file_get_contents(Input::file('ThirdImageInput')));

list($id, $rev) = $connection->putDocument(array(
    'name' => $name,
    'location' => $location,
    'phone' => $phone,
    'website' => $website,
    "_attachments" =>[
        'FirstImage.png' => [
            'content_type' => "image/png",
            'data' => $FirstImage
        ],
        'SecondImage.png' => [
            'content_type' => "image/png",
            'data' => $SecondImage
        ],
        'ThirdImage.png' => [
            'content_type' => "image/png",
            'data' => $ThirdImage
        ]
    ],
), $id, $rev);

...

так же, как вы можете хранить одно изображение.

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