Хранение изображений для нескольких пользователей - PullRequest
2 голосов
/ 21 февраля 2009

Платформа на самом деле не так важна, как теория. Для записи, это ASP.NET (C # на 3.5 SP1), SQL Server 2005. Ради аргумента, у меня неограниченное пространство (файловая система и база данных) и неограниченная пропускная способность.

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

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

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

Любая обратная связь будет оценена!

Ответы [ 3 ]

3 голосов
/ 21 февраля 2009

Я согласен, что хранение изображений / файлов в файловой системе вместо базы данных является хорошим подходом.

Что касается времени доступа к файлу, вы можете проверить, какую файловую систему вы используете, как она ведет себя, если каталог содержит много файлов. Некоторые файловые системы могут ухудшить производительность, если это огромный список. Если это так, вы можете создать структуру папок, например, от 00-FF, и это может быть на нескольких уровнях в зависимости от количества файлов, которые вы ожидаете. Вы могли бы, например, используйте MD5-хэш некоторого поля (например, имя файла), чтобы отсортировать его в правильный каталог (например, хэш FABE063E ... переходит в FA / BE / имя файла).

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

(Если права доступа не важны, а OTOH нужны предположительные имена файлов, вы, очевидно, идете другим путем и, возможно, используете имена пользователей в качестве структуры папок и т. Д.)

1 голос
/ 21 февраля 2009

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

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

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

1 голос
/ 21 февраля 2009

Я думаю, вам следует обратиться к PresentationBase.dll, это даст вам доступ к Windows Imaging Component (WIC), упакованному Windows Presentation Foundation. Даже если это проект ASP.NET, вы можете положиться на эти классы для кодирования и декодирования изображений. Эти классы стоят с двоичными данными или потоками и могут декодировать и кодировать несколько популярных форматов изображений и генерировать миниатюры на лету из хранилища с высоким разрешением посредством различного декодирования и кодирования, высоты и ширины.

Классы находятся в пространстве имен System.Windows.Media.Imaging и являются производными от BitmapEncoder или BitmapDecoder. Есть также несколько других сторонних реализаций, которые вы можете получить, если будете использовать эти классы.

...