Содержание
Отправка файлов клиенту — одна из часто используемых возможностей современных веб-приложений. Используя возможность 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().

