Ранее мы уже рассматривали отправку файлов клиенту в 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); |
|
public static IResult File (Stream fileStream, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false); |
|
public static IResult File (string path, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false); |
|
Рассмотрим пример. Для начала добавим в проект какой-нибудь файл:
Теперь создадим следующий маршрут в нашем приложении:
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);
то никакой ошибки не произойдет — файл будет отправлен клиенту.
Методы Physical File и Virtual File класса TypedResults
Статический класс TypedResults
предоставляет нам также ещё два метода для отправки файлов клиенту. Эти методы работают идентично методу File
и содержат те же параметры.
Метод | Описание параметров |
public static VirtualFileHttpResult VirtualFile (string path, string? contentType = default, string? fileDownloadName = default, DateTimeOffset? lastModified = default, EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false); |
|
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
.