Всемогущий, Google, найди мне чего-нибудь!

четверг, 18 февраля 2010 г.

Загрузить файл на сервер ASP.NET MVC

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

Рис. 1. Примерный вид дерева с файлами.

Например, я сохраняю новый файл для программы ImgBurn. Такой папки не существует и поэтому когда мы напишем такой код:
foreach (string upload in Request.Files)
{
 if (!Request.Files[upload].HasFile()) continue;

 string path = Server.MapPath("~/Files/" + SoftName);
 string filename = Path.GetFileName(Request.Files[upload].FileName);
 Request.Files[upload].SaveAs(Path.Combine(path, filename));
}
Сервер ругнется, что не может найти папку с названием SoftName. Посему, необходимо поставить условие, которое будет создавать папку с названием SoftName, если она не существует. Я написал скрытый метод в своем контроллере, но лучше выносить такие методы в отдельные классы или расширения:
/// <summary>
 /// Inspects directory existence.
 /// </summary>
 /// <param name="directory">Directory name to inspect.</param>
 /// <returns>Whether directory exists.</returns>
 private bool IsDirectoryExist(string directory)
 {
  string[] directories = Directory.GetDirectories(Server.MapPath("~/Files"));
  return directories.Contains(name);
 }
Функция Contains является расширением от Linq, поэтому необходимо подключить её используя ключевое слово using (using System.Linq). Вот такая простая функция. Теперь необходимо вставить условие для проверки существования папки. Полная версия будет выглядеть примерно так:
if (!IsDirectoryExists(SoftName))
 {
  Directory.CreateDirectory(Server.MapPath("~/Files/" + SoftName));
 }

 foreach (string upload in Request.Files)
 {
  if (!Request.Files[upload].HasFile()) continue;

  string path = Server.MapPath("~/Files/" + SoftName);
  string filename = Path.GetFileName(Request.Files[upload].FileName);
  Request.Files[upload].SaveAs(Path.Combine(path, filename));
 }
Теперь при сохранении очередной версии какого-либо софта будет создаваться папка с его названием, если её не существовало.

* Функция HasFile() является расширением. Почитать про неё можно тут.

Комментариев нет: