2009-08-07 3 views
1

Что было бы лучшим методом для реализации следующего сценария: Веб-сайт требует галереи изображений, в которой хранятся как личные, так и общедоступные изображения. Я слышал, что вы можете хранить их в иерархии файлов или в базе данных. В настройке иерархии файлов, как предотвратить прямой доступ к изображению. В настройке базы данных доступ к изображениям возможен только через просмотр веб-страницы. Что было бы эффективным решением?Архитектура загрузки изображений ASP.NET

[Изменить] Спасибо всем за ответы. Я решил, что маршрут базы данных является лучшим вариантом для этого приложения, поскольку у меня нет прямого доступа к серверу. Привязан к папке веб-корней. Все ответы были высоко оценены.

+0

Какую базу вы используете? – RichardOD

ответ

2

Используя оба метода, я бы сказал, иди с базой данных. Если вы храните их на filestore, и они нуждаются в защите, вам придется хранить их за пределами веб-корня, а затем использовать обработчик (например, упоминания Джона), чтобы получить их. Это так просто, чтобы написать обработчик для потоковой передачи их непосредственно из базы данных, и вы получите несколько преимуществ:

  • с базой данных вам не нужно беспокоиться о разрешениях FILESTORE или генерации уникальных имен файлов или иерархии папок и т.д.
  • С базой данных вы можете легко применять разрешения и защиту напрямую - не пытайтесь выяснить, кто может просматривать то, что основано на путях и т. Д.
  • С базой данных вы можете хранить изображение и метаданные вместе - при удалении метаданных вы удаляете изображение - нет возможности потерять записи, которые вы удаляете из базы данных, но не из файла filestore
  • Легче резервной базы данных и изображения, а затем восстановить

Недостаток производительности, но вы можете использовать кеширование и т. д., чтобы помочь с этим. Вы можете также использовать FILESTREAM storeage in SQL Server 2008 означает, что вы получите производительность файловой системы, а через БД (и 05?):

«FILESTREAM интегрирует SQL Server Database Engine с помощью файла NTFS системы путем сохранения VARBINARY (макс) бинарная большой объект (BLOB) данных в виде файлов в файловой системе. Transact-SQL операторы могут вставлять, обновлять, запрос, поиск и резервное копирование данных FILESTREAM. Win32 файловой системы интерфейсы обеспечивают потоковый доступ к данным.

FILESTREA M использует системный кеш NT для кэширования данных файла. Это помогает уменьшить любой эффект, который могут иметь данные FILESTREAM на базе Database Engine . Баланс SQL Server не используется; поэтому эта память доступна для обработки запросов .»

1

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

Чтобы ответить на ваш вопрос о прямом доступе, вы должны настроить изображения файлов так же, как и для базы данных: вы использовали бы какую-то страницу (возможно, обработчик .ashx), которая служит изображениям, что позволяет вам слой логики между пользователем и изображением, чтобы определить, должны ли они иметь к нему доступ. Фактический каталог, в котором находятся изображения, должен был либо: a) не быть частью структуры каталогов в IIS, либо b), если он является частью IIS, разрешать доступ только для Windows, и разрешать только запуск учетной записи приложения под доступом к каталогу.

+0

Если вы находитесь в среде с балансировкой нагрузки, вы захотите либо иметь сервер, назначенный как сервер ресурсов, либо создать какой-то механизм мечения дублирования между серверами. – andrewWinn

2

Используя иерархию файлов, вы можете поместить файлы из папки файла веб-сайта, например, предположите, что веб-папка c:/inetpub/wwwroot/somesite, поместите файл под c:/images /, чтобы веб-пользователи не смогут получить доступ к файлам изображений. но вы не можете напрямую использовать прямую ссылку на своем веб-сайте, вам нужно создать некоторую процедуру для чтения файла, вернуть поток.

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

+0

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

+1

Насколько я понимаю, есть ограничение. но по собственному опыту сервер sql обрабатывает его довольно хорошо ... :-) – Fred

+0

Andrew, см. мой комментарий re: FILESTREAM storage - это касается проблемы производительности –

0

Если вы используете IIS7, поскольку .NET запускается в конвейере раньше, я считаю, что вы также можете защитить файлы jpg, просто используя диспетчер ролей и применяя роли к файловым системным папкам. Если вы используете IIS6, я сделал что-то похожее на ответ Джона, где храню фактический файл вне wwwroot и использую обработчик, чтобы решить, имеет ли пользователь правильные учетные данные для просмотра изображения.

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

0

Ни. Amazon S3 предлагает очень простой API для приема загрузки. Вы можете использовать SimpleDB или базы данных SQL для отслеживания URL-адресов и разрешений. Установите цельные S3 ведро частным, и аутентифицировать его с помощью ключа AWS на сервере ASP.NET.

очень мало кода требуется загрузить на S3, и очень немного больше, необходимо будет выполнить bookeeping в SQL.

Как только они находятся в S3, возьмите image resizer library и S3 Reader plugin и y ou может работать со всей вашей системой в течение часа. И - он будет масштабироваться должным образом. Ограничений на диск или базу данных нет. Когда-либо.

Вы можете реализовать авторизацию, используя событие AuthorizeImage библиотеки Resizer Image. Просто бросьте AccessDeniedException, если доступ для текущего пользователя не разрешен.

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

Смежные вопросы