есть ли в asp.net-mvc хорошая библиотека или шаблон для сохранения содержимого пользователей (изображений, файлов и т. д.) - PullRequest
9 голосов
/ 26 августа 2011

У меня есть раздел администратора на моем веб-сайте, где «авторы» могут загружать файлы, например изображения для фотогалерей и т. Д., Для последующего включения в разделы с динамическим содержимым моего веб-сайта. У меня есть определенные страницы, где сам HTML хранится в моей базе данных MySQL, и пользователи могут редактировать содержимое с помощью интерфейса ckeditor .

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

Ответы [ 4 ]

10 голосов
/ 26 сентября 2011

Я сделаю это.У нас есть приложение, которое делает что-то похожее, что мы сделали, и мы сделали «сворачивать свои дела».Пользователи могут загружать файлы (изображения, документы, что угодно) через интерфейс нашего приложения, и эти файлы имеют разрешения, чувствительные к пользователю / компании / роли.Чтобы устранить некоторые проблемы безопасности и по нескольким другим причинам, мы реализовали следующее:

  1. В веб-приложении мы создали папку «Активы», которая используется для хранения всехпользовательского контента.Затем мы используем подпапки для сегментирования контента (логотипы, файлы и т. Д.).

  2. В файле web.config мы настроили эту папку так, чтобы она не была доступна из браузера (например,App_Data или папки bin) со следующими строками (Мы сделали это, чтобы гарантировать, что ни один из этих файлов не будет доступен напрямую из браузера. Подробнее о пункте # 4):

     <system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment="Assets"/>
        </hiddenSegments>
      </requestFiltering>
    </security>
    

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

  4. Для извлечения файлов мы реализовали контроллер с набором действий, который принимает запрошенное имя файла ипользовательская информация (поскольку вы должны войти в систему) и возвращает файл из папки активов.Для конечного пользователя это выглядит так, как будто все файлы хранятся в / Files / Docs / FileID или чем-то подобном, но на самом деле это всего лишь интерфейсный «привратник» для самих файлов.Этот метод контроллера / действия возвращает 404, если вы не авторизованы или запрашиваете неверный файл.Для именования файлов мы просто генерируем идентификаторы GUID и называем файл «GUID.relevantExtension» (проверяя, что он уже не существует)

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

РЕДАКТИРОВАТЬ - Еще одна мысль об этом, будьте осторожны при публикации из VS.Эти загруженные файлы не являются частью вашего решения, и если вы выполните публикацию Удалить тип загрузки, вы добавите файлы пользователей.Просто предостережение (был там: /)

0 голосов
/ 29 сентября 2011

Библиотека изменения размера изображения для этого типа веб-сайта CMS доступна здесь

0 голосов
/ 21 сентября 2011

Если вы создаете форму с энтипом multipart / form-data, вы можете получить HttpPostedFileBase в вашем контроллере.

В представлении:

<form action="/MyController/MyAction/" method="post" enctype="multipart/form-data">

В контроллере:

public ActionResult MyAction(HttpPostedFileBase httpPostedFileBase) { // Your code here. }

Аргумент httpPostedFileBase будет сопоставлен связывателем модели по умолчанию.

0 голосов
/ 28 августа 2011

Я думаю, что в конечном итоге вы просто "напишите все это с нуля".

Для меня у меня есть папка "Файлы", а затем я создаю подпапки для каждого пользователя иесли я создаю много типов в этих подпапках UserFolder для каждого типа данных.

В моей БД я просто храню "Пути", чтобы получить эти файлы.

...