Я понятия не имею, как большие сайты сохраняют фотографии на своих серверах. Может ли кто-нибудь сказать мне, как они сохраняют фотографии, которые загружаются пользователями в их базе данных?
Я думал, может быть, они просто сохранили файл (изображение) на каком-то пути и просто сохранили бы этот путь в базе данных, верно?
Но я хочу сделать это так. Это правильно? Например, сайт под названием www.photos.com
. Когда пользователь загружает изображение, я бы создал папку с именем пользователя и сохранил эти фотографии в этой папке.
Я считаю, что мы можем создать каталог с использованием php file concepts
. Поэтому, когда новый пользователь загружает свою фотографию или файл, я хочу создать каталог с его именем.
Пример: если имя пользователя john, я бы создал каталог, подобный этому на photos.com www.photos.com/john/
а затем сохранил все его фотографии в этом каталоге, когда он загрузит изображение. Правильно ли это?
У меня нет никого, кто бы хорошо знал о сохранении файлов на серверах, поэтому, пожалуйста, дайте мне знать, как это сделать? Я хочу сделать это правильно и безопасно.
Все крупные веб-сайты не сохраняют изображения в базе данных, которую они хранят на диске. Они сохраняют ссылку на позицию изображения в таблице. А потом связь оттуда.
Зачем? Представление.
Тяжелый контент из базы данных является огромным узким местом производительности. И базы данных не масштабируются горизонтально так хорошо, поэтому это будет означать еще большую проблему. На всех крупных сайтах используются статические контентные фермы для работы со статическим контентом, таким как изображения. Это серверы, которые не будут заботиться о вашей личности.
Как они сохраняют фотографии действительно частными, о которых вы могли бы спросить? Они этого не делают.
Ссылка на картинку сама по себе является адресом и паролем. Давайте возьмем Facebook, например. Если я сохраню личную фотографию в своей учетной записи, вы не сможете ее открыть. Но, пока у вас есть правильный адрес, вы можете.
Это изображение личное . Обратите внимание на имя файла
10400121_87110566301_7482172_n.jpg
(facebook меняет URL-адрес время от времени, поэтому ссылка может быть нарушена)
Это не является последовательным. Единственный способ получить картину – узнать ее адрес.
На основании предыдущей фотографии пользователя вы не можете угадать следующий.
У этого есть огромная энтропия, так что, даже если вы начнете принимать произвольные дикие догадки, у вас будет множество неудач, и, если вы дойдете до картины, вы не сможете оттуда осознать личность владельцев, сама по себе, является защитой в анонимности.
Изменить (почему вы не должны хранить изображения в папке «имя пользователя»:
После вашего редактирования стало ясно, что вы намерены размещать файлы на диске, а не в базе данных. Это изменение охватывает новый сценарий.
Несмотря на то, что ваша логика (создание папки для каждого пользователя) более упорядочена, она создает проблемы, когда вы начинаете иметь много пользователей и много изображений. Представьте, что на ваших серверах есть 1T дисковое пространство. И позволяет также предположить, что 1T более или менее точен с нагрузкой, которую может обрабатывать сервер.
Теперь у вас есть 11 пользователей, предположим, что они начинают загрузку в одно и то же время, и каждый загрузит более 100 ГБ файлов. Когда они достигают 91 ГБ каждый сервер заполнен, и вы должны начать хранить изображения на другом сервере. Если эта структура пользователя / папки соблюдается, вам придется выбрать одного из пользователей и перенести все свои данные на другой сервер. Кроме того, это делает жесткий лимит для пользователя, который не может загружать более 1 т в файлы.
Должен ли я хранить все файлы в одной папке?
Нет, большие сайты обычно хранят файлы в последовательных папках (/ 000001 /, / 000002 / и т. Д.), Имеющих x определенное количество файлов в папке. Это в основном связано с проблемами производительности файловой системы.
Больше о том, сколько файлов в каталоге слишком много?
Как правило, плохая идея хранить изображения в вашей базе данных (если ваш сайт популярен). База данных традиционно является одним из основных узких мест в большинстве приложений. Не нужно загружать его больше, чем необходимо. Если изображения находятся в файловой системе, многие HTTP-серверы (например, nginx ) будут обслуживать их наиболее эффективно.
Самая большая социальная сеть в России, Vkontakte делает именно это: хранить изображения в файловой системе.
Еще одна большая социальная сеть реализовала сложное масштабируемое хранилище памяти. Но это не доступно для общественности, AFAIK.
Резюме этого ответа: не храните blob в базе данных.
это правильный способ сделать
Да.
Единственное, что я предложил бы использовать не имя, а id.
www.photos.com/albums/1234/
было бы хорошо для стартера.
Управление изображениями может быть достигнуто путем физической загрузки изображений на сервер, а затем записи местоположения файла и деталей изображения в базе данных. Впоследствии форма поиска может быть настроена так, чтобы позволить пользователю выполнять текстовый поиск, поиск номера деталей или другие запросы. Сценарий PHP можно написать для создания допустимого тега HTML-изображения на основе данных, найденных в таблице.
загрузка изображений в поле BLOB MySQL ™ – такая плохая идея, что такие данные изображения обычно проблематичны, если изображения намного больше, чем эскизы. Если изображения большие, вам может понадобиться скопировать / вставить один оператор SQL INSERT за раз (в phpMyAdmin). Если изображения большие, и оператор SQL INSERT разбит на две строки вашим текстовым редактором, вы никогда не сможете восстановить изображение.