Архитектура загрузки изображений ASP.NET - PullRequest
1 голос
/ 07 августа 2009

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

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

Ответы [ 5 ]

2 голосов
/ 08 августа 2009

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

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

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

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

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

2 голосов
/ 08 августа 2009

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

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

1 голос
/ 08 августа 2009

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

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

0 голосов
/ 17 июля 2011

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

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

Как только они окажутся в S3, возьмите библиотеку Resizer для изображений и плагин S3 Reader , и вся ваша система сможет работать менее чем за час. И - это будет правильно масштабироваться. Нет ограничений по объему диска или базы данных. Когда-либо.

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

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

0 голосов
/ 08 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...