Хранение загруженных пользователем файлов на веб-сервере - PullRequest
7 голосов
/ 28 октября 2011

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

Хотя я хотел бы иметь архитектуру, которая хорошо масштабируется для больших объемов данных, в настоящее время я не беспокоюсь об очень больших (facebook-, google-scale) объемах.

Я думал о сохранении файлов в файловой системе на

/files/{username}/

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

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

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

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

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

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

Вернемся к теме безопасности, доступа и организации.Храните изображения в папке на пользователя (хотя в зависимости от количества пользователей количество папок может возрасти до неуправляемого уровня).Если вы не хотите, чтобы изображения были общедоступными, сохраните их в не веб-папке, попросите ваше приложение прочитать данные и передать их в потоковом режиме, чтобы отобразить изображение для пользователя.Сложнее, но вы скрываете фактический файл из Интернета.Кроме того, вы сможете проверять все запросы на изображение для аутентифицированного пользователя.

3 голосов
/ 28 октября 2011

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

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

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

Это помогает?

...