Контроллеры ASP.NET Core MVC. Отправка файлов клиенту

Отправка файлов клиенту — одна из часто используемых возможностей современных веб-приложений. Используя возможность ASP.NET Core MVC, мы можем организовать отправку файлов пользователю различными способами.

Класс FileResult и его наследники

Для отправки файлов в ASP.NET Core предусмотрен абстрактный класс FileResult. Функционал этого класса реализуется в его наследниках:

  • FileContentResult — отправляет клиенту массив байтов (byte[]), считанный из файла. Этот класс можно использовать, например, для отправки небольших по размеру файлов.
  • VirtualFileResult — представляет простую отправку файла напрямую с сервера по виртуальному пути
  • FileStreamResult — создает поток Stream, с помощью которого считывает и отправляет файл клиенту. Этот класс можно использовать для отправки больших по размеру файлов.
  • PhysicalFileResult — также отправляет файл с сервера, но для отправки используется реальный физический путь

В классе Controller для создания объектов этого класса используется большое количество перегруженных методов. Так, например, для отправки файла с помощью классов FileContentResult, FileStreamResult и VirtualFileResult используется метод File() который имеет 24 перегруженных версии и ещё 8 версий имеет метод PhysicalFile() для создания класса PhysicalFileResult. Конечно, все эти версии мы рассматривать не будем, а затронем только основные моменты по отправке файлов клиенту.

Отправка массива байтов (класс FileContentResult)

Создадим новое приложение ASP.NET Core MVC и добавим в папку wwwroot любой файл, например, картинку:

Теперь создадим в контроллере HomeController следующее действие:

public IActionResult GetFile() 
{
    byte[] bytes = System.IO.File.ReadAllBytes(@"wwwroot\plachet_ot_radosti.jpg");
    return File(bytes, "image/jpeg", "image.jpg");
}

здесь мы воспользовались одной из версий метода File() и указали в параметрах метода, помимо массива байтов, MIME-тип и название файла с которым он будет загружаться на компьютер пользователя. Результат выполнения действия:

Отправка потока (класс FileStreamResult)

Для отправки файла в виде потока Stream клиенту также может использоваться одна из версий метода File(). Например, перепишем наш метод GetFile() следующим образом:

public IActionResult GetFile() 
{
    var stream = new FileStream(@"wwwroot\plachet_ot_radosti.jpg", FileMode.Open, FileAccess.Read);
    return File(stream, "image/jpeg", "image.jpg");
}

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

Отправка файла по виртуальному пути (класс VirtualFileResult)

По умолчанию, все пути к статическим файлам в ASP.NET Core MVC определяются относительно папки wwwroot проекта. Поэтому, мы можем воспользоваться следующим вызовом метода File(), чтобы использовать VirtualFileResult и отправить клиенту файл:

public IActionResult GetFile() 
{
    return File("plachet_ot_radosti.jpg", "image/jpeg", "image.jpg");
}

Отправка файла по пути (класс PhysicalFileResult)

Есил нам необходимо отправить клиенту файл, который располагается вне нашего проекта, например, на другом жестком диске, то мы можем воспользоваться методом PhysicalFile():

public IActionResult GetFile() 
{
    return PhysicalFile(@"c:\favicon.ico", "image/x-icon", "image.ico");
}

Итого

Для отправки файла клиенту мы можем воспользоваться различными версиями метода File(), используя для отправки как массивы байтов, так и потоки (Stream). Также, мы может отправлять файлы, используя виртуальный путь к файлу (по умолчанию, это путь относительно папки wwwroot проекта) или физический путь. При использовании физического пути к файлу мы должны использовать метод PhysicalFile().

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии