9 февраля 2009 г.

ASP.NET: Хранение изображений в файловой системе.

При написании приложений ASP.NET у каждого программиста или команды программистов возникает вопрос: "Где хранить изображения? В базе данных или при помощи файловой системы?"

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

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

У каждого, кто пытается сохранять изображения в файловой системе, возникает один вопрос: "Как добиться оригинальности имен файлов?"

Если на сайте у пользователя есть возможность закачивать файлы, то я предлагаю следующий выход.
В корне сайта создается папка, например Users, в неё в последствии и будут закачиваться файлы. Чтобы файлы закаченные пользователем были упорядоченны, то для каждого пользователя создается папка с его именем. Например для сохранения аваторов пользователя можно воспользоваться двумя способами.

Первый: В каталоге Users создается подкаталог Avatars в который и закачиваются аватары по именам пользователей.
Пример:
/Users/Avatars/Admin.jpg
/Users/Avatars/mr_lolik.jpg
/Users/Avatars/vasja.jpg


Второй: Этот способ ни на много отличается от первого, всего-лишь в папке у каждого пользователя создается файл Avatar.jpg в котором хранится его аватар.
Пример:
/Users/Admin/Avatar.jpg
/Users/mr_lolik/Avatar.jpg
/Users/vasja/Avatar.jpg


Как же поступать с файлами, которые закачивает пользователь, например, для размещения в статьях или новостях? Тут можно размещать файлы в папке пользователя с именем состоящим из времени, когда он был закачен, например так 20081209.jpg. Здесь как видно было указано, что файл закачен 9 декабря 2008 года.

Но, что делать, если пользователь в этот день надумает закачать несколько файлов? Тут можно поступить опять двумя способами, либо добавлять префиксы с номером файла, например 20081209_1.jpg, 20081209_2.jpg, 20081209_3.jpg ... 20081209_n.jpg. Этот способ мне не нравится тем, что при закачке большого количества файлов, проверок на существование файла будет очень много, а именно ровно столько, сколько файлов было сегодня залито, что согласитесь не очень удобно.

Самым на мой взгляд удобный способ это сохранение файла по следующему шаблону: [Год][Месяц][День][Час][Минута][Секунда][Миллисекунда].[расширение файла], то есть файл может выглядеть как 200812092345012.gif

1 комментарий:

SanSYS комментирует...

проще Guid или половину от него хотябы :), думаю тут вовсе не принципиально