где на сайте asp.net сохраняются загруженные файлы и как сделать для них ссылку для скачивания? - PullRequest
0 голосов
/ 18 июня 2011

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

Я хочу лучший вариант для загрузки этих документов:

  • вариант 1 - создать каталог в папке веб-сайта и сохранить его имя в файле web.config веб-сайта, а также сохранить имя файла документа в моей базе данных, поэтому, когда я хочу создать ссылку для загрузки, мне нужно объединить корневой URL-адрес и имя папки и имя файла документа.

    например http://www.website.com + "/ DoucmentsFolder" + "/ Имя файла документа"

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

спасибо

1 Ответ

4 голосов
/ 18 июня 2011

Проблемы с использованием FileStore несколько:

1) Очистка - вам нужно оставить файл там достаточно долго, чтобы его можно было запросить и собрать, но как вы очищаетесь? Если вы этого не сделаете, вы рискуете нехватки места. Лучший способ - запускать запланированное задание так часто и удалять файлы старше, чем, скажем, час - но это все еще грязно.

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

3) Не выполняется - по сравнению с операцией базы данных.

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

Вместо создания файла и ссылки на него, верните файл как FileContentResult:

 public FileContentResult GetFile(int fileId)
{
        myFile MyFile = fileRepository.Get(fileId);
        return MyFile(file.Data, file.MimeType);
    }
}

где MyFile выглядит так:

 public class MyFile
 {
    public MyFile(byte[] fileData, string mimeType)
    {
       this.FileData = fileData;
       this.MimeType = mimeType;
    }

    public virtual int Id {get; private set;}
    public virtual byte[] FileData { get; set; }
    public virtual string MimeType { get; set; }
}

Для сохранения файла

 [HttpPost]
 public ActionResult SaveFile(HttpPostedFileBase userFile)
 {
    MyFile myFile = new MyFile(new byte[userFile.ContentLength], userFile.ContentType)
    userFile.InputStream.Read(MyFile.FileData, 0, userFile.ContentLength);

    fileRepository.Save(myFile);

 }
...