Управление загруженными пользователями файлами с веб-сайта ASP.NET и Visual Studio - PullRequest
1 голос
/ 17 февраля 2012

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

По сути, как вы должны эффективно управлять файламичто загрузили пользователи, такие как изображение профиля?То, что я хочу знать, - это некоторые «лучшие практики», касающиеся того, ГДЕ создать структуру каталогов.

Второй ответ на поставленный выше вопрос предлагает некоторые варианты, такие как хранение их вне Интернета.root, о чем я и думал вначале.Но потом я начал думать ...

1) Как мы сохраняем пути в базе данных?Абсолютное?Относительный? У каждого пользователя есть столбец для "ProfilePicPath".Что если мы хотим полностью перегрузить весь проект с одного сервера на другой, и по какой-то причине мы не можем поместить файлы в одно и то же место на новом сервере?Каждая ссылка будет неработоспособной.

2) Как с этим следует обращаться с точки зрения безопасности? Скажем, у нас развернуто наше веб-приложение в виде C: \ website \ site1, но мы хранимКартинки профиля пользователя в виде C: \ usercontent \ profilepictures \?На странице, где мы загружаем изображение профиля, как мы можем безопасно получить к нему программный доступ в коде?Мы не хотим помещать их как C: \ website \ site1 \ usercontent \ profilepictures \, верно?Я не фанат введения абсолютного пути в базу данных, и я также не хочу жестко задавать путь в любом месте кода позади.

Мы изначально ДЕЙСТВИТЕЛЬНО пробовали файлы внутри веб-проекта, но потом это стало своего рода риском, потому что эти пользовательские файлы были частью нашего проекта.Одна неправильная копия / вставка при обновлении / изменении сайта, и мы могли бы перезаписать файл, загруженный пользователем с тех пор, как мы в последний раз извлекли проект из хранилища, и т. Д. Это было огромной проблемой, и весь сценарий просто кричал мне "ты идиот, ты все делаешь неправильно ... "но я просто не могу найти правильного руководства, чтобы делать это" правильно ".

Просто чтобы быть ясно, наши потребности минимальны -- это всего лишь небольшой проект для внутреннего использования, не более 30 пользователей, и все это должно содержаться на одном сервере IIS 7.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

1) Как сохранить пути в базе данных? Абсолютное? Родственник? У каждого пользователя есть столбец для «ProfilePicPath». Что если мы хотим полностью перегрузить весь проект с одного сервера на другой, и по какой-то причине мы не можем поместить файлы в одно и то же место на новом сервере? Каждая ссылка будет битой.

Относительная. В ProfilePicPath просто сохраните имя файла, если вы хотите сделать это таким образом. У меня есть веб-приложение, в котором мне было проще хранить картинку в столбце SQL с типом данных «изображение». Считается, что изображение является частью данных приложения, а не кода приложения, поэтому сохраните его в базе данных.

2) Как с этим следует обращаться с точки зрения безопасности? Допустим, наше веб-приложение развернуто на C: \ sites \ site1, но мы храним изображения профиля пользователя в C: \ usercontent \ profilepictures \? На странице, где мы загружаем изображение профиля, как мы можем безопасно получить к нему программный доступ в коде? Мы не хотим помещать их как C: \ website \ site1 \ usercontent \ profilepictures \, верно? Я не фанат введения абсолютного пути в базу данных, и я также не хочу жестко задавать путь в любом месте кода позади.

В вашем web.config есть приложение, которое выглядит так:

<add key="ProfilePicturePath" value="C:\usercontent\profilepictures\" />

И ваш код может использовать Path.Combine(s1, s2) для объединения AppSetting со значением базы данных ProfilePicPath для пользователя. Для обслуживания файла изображения вы можете ссылаться на HTTP-обработчик, например <img src="Pic.ashx" />. Код, который я использую для получения изображения из базы данных, приведен ниже, но если вы получали данные из папки, вы можете использовать System.IO.File.Open(), чтобы получить поток из файловой системы.

public class Pic : IHttpHandler
{
    #region Properties

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

    #endregion

    #region Implemented Interfaces

    #region IHttpHandler

    public void ProcessRequest(HttpContext context)
    {
        var userRecord = DAL.GetCurrentUser();

        if (userRecord != null)
        {
            byte[] picture = userRecord.ProfilePicture.ToArray();

            context.Response.ContentType = "image/jpeg";
            context.Response.OutputStream.Write(picture, 0, picture.Length);
            context.Response.OutputStream.Close();
        }
    }

    #endregion

    #endregion
}
1 голос
/ 17 февраля 2012

Что я сделал с моим веб-сайтом

  1. Я создал поддомен для доступа к файлам (например, static.domain.com)
  2. На моем главном сайте я добавил некоторые appSettings в web.config для путей к файлам, подобных этим

       <add key="MainPath" value="http://static.domain.com/ImageDatabase/" />
       <add key="Profile" value="Profile/" />         
       <add key="Advertisements" value="Ads/" />         
    
  3. Я создал класс, который возвращает каталог мне нужно получить определенный файл.Я сериализовал свои файлы, чтобы связать их с профилями в моей базе данных с именами вроде photo_1.png, которые можно найти, например, в каталоге профилей, поэтому, когда я ищу фотографию для профиля для идентификатора учетной записи 1, я просто назову свой класс следующим

string ProfileDir = clsDirectory.GetProfileDirectory();

string filePath = ProfileDir + "photo_" + UserId + ".png";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...