2009-04-23 3 views
0

У меня есть приложение ASP.NET. Я хочу, чтобы пользователи могли загружать документы. Где в файловой системе я должен хранить эти документы? Пользователи должны иметь возможность загружать их и просматривать гиперссылки на них на сайте, но UserA не должен видеть документы UserB, но роль администратора должна быть в состоянии увидеть все.Загрузка файлов на мой сайт

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

Кто-нибудь, пожалуйста, дайте мне несколько лучших практик. Благодаря!

ответ

2

В зависимости от размера файлов, одним из вариантов было бы хранить файлы вне корневого веб-сайта, поэтому никто не мог бы ссылаться на них, а затем, как было предложено, создать страницу с некоторыми аргументами и Response.WriteFile() из указанного каталога.

Если файлы большие, вы можете использовать Response.TransmitFile для сохранения на некоторой памяти на сервере.

С точки зрения внедрения, я бы, вероятно, сохранил настоящее имя файла в базе данных, чтобы избежать коллизий именования и сохранять файлы на диске, переименованные в нечто вроде GUID или только целочисленный идентификатор, взятый из таблицы базы данных ,

Затем, когда вы записываете файл в выходной поток, вы можете использовать content disposition header, чтобы переименовать файл в исходное имя.

HTH!

+0

Спасибо! Надеюсь, что на следующей неделе я вернусь. –

+0

Это метод, который я использовал и рекомендую. – Bryan

0

Возможно, вам понадобится структура папки с одной папкой для каждого пользователя. Вы можете написать свой собственный метод CreateFolder(), который после создания папки добавляет файл web.config с правилами авторизации, позволяя ему обращаться только к пользователю и администраторам. Таким образом, пользователи могут получать доступ только к своим собственным файлам, но администраторы могут получить доступ ко всем.

EDIT: Для уточнения - я предполагаю, что вы используете функции членства ASP.NET (хотя и не обязательно именно так, как есть), который позволяет поместить отдельные web.config файлы в каталоге с узлами, показанными ниже контроля доступ.

<configuration> 
    <system.web> 
    <authorization> 
     <allow roles="admin" /> 
     <allow users="TomasLycken" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</configuration> 
+0

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

+0

Я бы получил его на сайте, но это потому, что я обычно считаю, что поиск файлов в файловой системе за пределами веб-сайта является довольно утомительной задачей. Не то, чтобы это действительно так сложно, но это очень редко. Но я думаю, что общий обработчик (см. Мой другой ответ) - это то, что вы ищете. В классических случаях ASP и PHP вам нужны каталоги файлов за пределами сайта, чтобы убедиться, что доступ не возможен (возможно, но не обязательно, с ASP.NET). –

+0

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

0

Другой способ сделать это, чтобы поместить все файлы в одном месте, к которому вы статически разрешить доступа к кому-либо, а затем общий обработчик (.ashx), который обслуживает файлы после отрываясь URL и разрешения из базы данных. Это, вероятно, более чистый подход, и он также будет занимать меньше места, видя, как вы не будете иметь тонн web.config файлы прокладки вокруг ...


Примечание: Я намеренно отправил это как отдельный ответ, так что вы может отметить решение, которое вы предпочитаете в качестве ответа, и игнорировать другое.

+0

Мне нужно будет исследовать обработчики. Я никогда не использовал их раньше. –

+0

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

+0

Я думаю, что это, вероятно, так, как я пойду. Тем не менее, я хотел бы попытаться найти решение, которое будет работать для PHP, ASP и ASP.NET. Мне бы очень хотелось иметь три разных решения одной и той же проблемы. –

0

У меня есть решение, подобное этому. Я храню файлы в защищенной (через раздел web.config) папке на веб-сайте, но вместо реальных имен файлов я использовал подсказки. У меня также была база данных, которая отображала имена реальных имен и имела некоторую дополнительную информацию, такую ​​как размер файла, тип и т. Д. В вашем случае эта информация также может содержать имя пользователя, загрузившего файл. Чтобы загрузить файл, я применил обработчик HTTP, который получил бы параметр guid и на основе типа файла установил соответствующий HTTP-заголовок и напишет содержимое файла в ответ. Прежде чем я напишу файл в ответ, я также проверю разрешения для текущего пользователя. Затем у меня есть страница, которая отображает список имен файлов в виде гиперссылок, которые указывают на этот обработчик HTTP с параметром guid, который соответствует определенному файлу в защищенной папке. Для загрузки я использовал очень хороший контроль SlickUpload: http://krystalware.com/Products/SlickUpload/

0

Вы можете создать виртуальный каталог смежного (как одноуровневые) в корневой каталог вашего сайта в IIS это несколько вещей 1) он предотвращает доступ пользователей к файлы напрямую, угадывая местоположение файла, 2) вы можете указать виртуальный каталог в любое место, которое вы хотите, 3) при выключенном просмотре каталогов вы можете запретить кому-либо видеть структуру. Затем вы можете сохранить пути в базе данных, чтобы удалить фактическую структуру от клиентов.

+0

Джереми, я не понимаю, как № 1 выполняется. –

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