Как лучше всего загружать и хранить фотографии на сайте? - PullRequest
50 голосов
/ 19 января 2012

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

Я думал, может быть, они просто сохранят файл (рисунок) по какому-то пути и просто сохранят этот путь в базе данных, верно?

Но я хочу сделать это таким образом. Это правильно? Например, веб-сайт с именем www.photos.com. Когда пользователь загружает изображение, я создаю папку с именем пользователя и сохраняю эти изображения в этой папке.

Я считаю, что мы можем создать каталог, используя php file concepts. Поэтому, когда новый пользователь загружает свою фотографию или файл, я хочу создать каталог с его именем.

Пример: если имя пользователя - Джон, я бы создал каталог на этом сайте photos.com www.photos.com/john/, а затем сохранял бы все его изображения в этом каталоге, когда он загружал изображение. Это правильный способ сделать это?

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

Ответы [ 4 ]

168 голосов
/ 19 января 2012

Все крупные сайты не сохраняют изображения в базу данных они хранят их на диске. Они сохраняют ссылку на положение картинки в таблице. А потом ссылку оттуда.

Почему? Производительность.

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

Как они могут сохранять конфиденциальность фотографий, спросите вы? Они не.

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

Это частное изображение . Обратите внимание на имя файла
10400121_87110566301_7482172_n.jpg
(время от времени Facebook изменяет URL, поэтому ссылка может быть неработающей)

Это не последовательно. Единственный способ получить изображение - узнать его адрес.
Основываясь на предыдущей фотографии пользователя, вы не можете угадать следующую.
Он обладает огромной энтропией, поэтому даже если вы начнете делать случайные дикие предположения, у вас будет большое количество сбоев, и, если вы дойдете до картинки, вы не сможете оттуда понять личность владельцев, которая, сама по себе защита анонимности.

Редактировать (почему не следует хранить изображения в папке «username»:
После вашего редактирования стало ясно, что вы намерены поместить файлы на диск, а не в базу данных. Это редактирование охватывает новый сценарий.

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

Теперь у вас есть 11 пользователей, предположим, что они начинают загружать одновременно, и каждый будет загружать более 100 ГБ файлов. Когда они достигают 91 ГБ каждый сервер заполнен, и вы должны начать хранить изображения на другом сервере. Если следовать этой структуре пользователя / папки, вам придется выбрать одного из пользователей и перенести все его данные на другой сервер. Кроме того, это накладывает жесткие ограничения на пользователя, который не может загружать в файлы более 1 т.

Должен ли я хранить все файлы в одной папке, тогда?
Нет, большие сайты обычно хранят файлы в последовательных папках (/ 000001 /, / 000002 / и т. Д.), Имеющих определенное количество файлов x в папке. В основном это связано с проблемами производительности файловой системы.

Подробнее о сколько файлов в каталоге слишком много?

5 голосов
/ 19 января 2012

Обычно плохая идея хранить изображения в вашей базе данных (если ваш сайт популярен).База данных традиционно является одним из основных узких мест в большинстве приложений.Не нужно загружать его больше, чем нужно.Если изображения находятся в файловой системе, многие http-серверы (например, nginx ) будут обслуживать их наиболее эффективно.

Самая большая социальная сеть в России, Вконтакте работает точноэто: хранить изображения в файловой системе.

В другой большой социальной сети реализовано сложное масштабируемое хранилище больших двоичных объектов.Но это не доступно для общественности, AFAIK.

Резюме этого ответа: не храните капли в базе данных.

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

это правильный способ сделать

Да.
Единственное, что я бы предложил использовать не имя, а идентификатор.
www.photos.com/albums/1234/ было бы хорошодля начала.

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

Управление изображениями лучше всего достигается путем физической загрузки изображений на сервер, а затем записи местоположения файла и сведений об изображении в базу данных. Впоследствии, Форма поиска может быть настроена, чтобы позволить пользователю выполнять текстовый поиск, поиск по номеру детали или другие запросы. PHP-скрипт может быть написан для создания правильного HTML-тега изображения на основе данных, найденных в таблице.

загрузка изображений в поле MySQL ™ BLOB - плохая идея, такие данные изображения, как правило, проблематичны, если изображения намного больше миниатюр. Если изображения большие, вам может понадобиться скопировать / вставить один оператор SQL INSERT за раз (в phpMyAdmin). Если изображения большого размера и текстовый редактор SQL INSERT разбит на две строки, вы никогда не сможете восстановить изображение.

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