Статические классы Results и TypedResults в ASP.NET Core. Отправка файлов

Ранее мы уже рассматривали отправку файлов клиенту в ASP.NET Core с использованием метода класса HttpResponse. Отправка файлов клиенту в статических классах Results и TypedResults может осуществляться с помощью нескольких методов, причем, в отличие от класса Results, класс TypedResults предоставляет сразу три метода работы с файлами.

Метод File() класса Results

Метод File отправляет клиенту файл и имеет несколько перегруженных версий:

Метод Описание параметров
public static IResult File (byte[] fileContents, string? contentType = default, string? fileDownloadName = default, bool enableRangeProcessing = false, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default);
  • fileContentsмассив байтов, содержимого файла
  • contentType — значение заголовка Content-Type для ответа
  • fileDownloadName — имя файла для загрузки
  • enableRangeProcessing — если равно true, то допускается загрузка файла по частям
  • lastModified — дата последнего изменения файла
  • entityTag — элемент EntityTagHeaderValue ассоциированный с файлов
public static IResult File (Stream fileStream, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);
  • fileStream — поток, содержащий данные файла
  • contentType — значение заголовка Content-Type для ответа
  • fileDownloadName — имя файла для загрузки
  • enableRangeProcessing — если равно true, то допускается загрузка файла по частям
  • lastModified — дата последнего изменения файла
  • entityTag — элемент EntityTagHeaderValue ассоциированный с файлов
public static IResult File (string path, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);
  • path — путь по которому расположен загружаемый файл
  • contentType — значение заголовка Content-Type для ответа
  • fileDownloadName — имя файла для загрузки
  • enableRangeProcessing — если равно true, то допускается загрузка файла по частям
  • lastModified — дата последнего изменения файла
  • entityTag — элемент EntityTagHeaderValue ассоциированный с файлов

Рассмотрим пример. Для начала добавим в проект какой-нибудь файл:

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

app.MapGet("/file", async () => {
    byte[] fileContent = await File.ReadAllBytesAsync(@"images\wow.jpeg");
    string contentType = "image/jpeg";
    string downloadName = "image.jpeg";
    return Results.File(fileContent, contentType, downloadName);
});

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

Что касается версии метода в котором задается путь к файлу, то здесь стоит отметить следующий момент — если путь не абсолютный, то он рассчитывается относительно пути указанного в свойстве WebRootPath объекта типа IWebHostEnvironment с которым мы ранее разбираись. Например, если я укажу такой путь к файлу:

return Results.File(@"c:\temp\wow.jpeg", contentType, downloadName);

то никакой ошибки не произойдет — файл будет отправлен клиенту.

Методы PhysicalFile и VirtualFile класса TypedResults

Статический класс TypedResults предоставляет нам также ещё два метода для отправки файлов клиенту. Эти методы работают идентично методу File и содержат те же параметры.

Метод Описание параметров
public static VirtualFileHttpResult VirtualFile (string path, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);
  • path — путь по которому расположен загружаемый файл
  • contentType — значение заголовка Content-Type для ответа
  • fileDownloadName — имя файла для загрузки
  • enableRangeProcessing — если равно true, то допускается загрузка файла по частям
  • lastModified — дата последнего изменения файла
  • entityTag — элемент EntityTagHeaderValue ассоциированный с файлов
public static PhysicalFileHttpResult PhysicalFile (string path, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);

 

Пример использования этих методов может быть такой:

app.MapGet("/file", async () => {
    string contentType = "image/jpeg";
    string downloadName = "image.jpeg";
    return TypedResults.VirtualFile(@"images\wow.jpeg", contentType, downloadName);
});

как и в случае с методом File, если указывается относительный путь, то он рассчитывается относительно свойства WebRootPath.

Итого

Для отправки файлов клиенту мы можем использовать методы File, VirtualFile и PhysicalFile статических классов Results и TypedResults (последние два метода). Файл можно отправлять как с использованием относительных и абсолютных путей к файлу, так и в виде массива байтов или потока Stream.

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