Содержание
Отправка файлов клиенту — одна из часто используемых возможностей современных веб-приложений. Используя возможность ASP.NET Core MVC, мы можем организовать отправку файлов пользователю различными способами.
Класс FileResult и его наследники
Для отправки файлов в ASP.NET Core предусмотрен абстрактный класс FileResult
. Функционал этого класса реализуется в его наследниках:
FileContentResult
— отправляет клиенту массив байтов (byte[]
), считанный из файла. Этот класс можно использовать, например, для отправки небольших по размеру файлов.VirtualFileResult
— представляет простую отправку файла напрямую с сервера по виртуальному путиFileStreamResult
— создает потокStream
, с помощью которого считывает и отправляет файл клиенту. Этот класс можно использовать для отправки больших по размеру файлов.PhysicalFileResult
— также отправляет файл с сервера, но для отправки используется реальный физический путь
В классе Controller
для создания объектов этого класса используется большое количество перегруженных методов. Так, например, для отправки файла с помощью классов FileContentResult
, FileStreamResult
и VirtualFileResult
используется метод File()
который имеет 24 перегруженных версии и ещё 8 версий имеет метод Physical
для создания класса 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()
.