Отправка файлов в Results API

Последнее обновление: 24.12.2021

Для отправки файлов с помощью Results API может применяться метод File(), который имеет ряд версий.

Отправка файла как массива байтов

Для отправки файла как массива байтов применяется следующая версия метода:

public static IResult File (byte[] fileContents, string? contentType = default, 
string? fileDownloadName = default, bool enableRangeProcessing = false, 
DateTimeOffset? lastModified = default, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = default);

Параметры метода:

  • fileContents: содержимое файла в виде массива байтов

  • contentType: тип содержимого файла - заголовок Content-Type

  • fileDownloadName: имя файла для загрузки

  • enableRangeProcessing: значение типа bool. Если оно равно true, то допустима обработка данных по частям

  • lastModified: значение типа Nullable<DateTimeOffset>>, которое указывает на дату последнего изменения файла

  • entityTag: значение типа EntityTagHeaderValue, которое ассоциировано с файлом

Например, создадим в проекте новую папку Files, в которую добавим какой-нибудь файл. Например, в моем случае это файл forest.png:

Отправка файлов Results API в ASP.NET Core и C#

Для отправки файла определим следующий код:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Map("/forest", async () => 
{
    string path = "Files/forest.png";
    byte[] fileContent = await File.ReadAllBytesAsync(path);  // считываем файл в массив байтов
    string contentType = "image/png";		// установка mime-типа
    string downloadName = "winter_forest.png";	// установка загружаемого имени
    return Results.File(fileContent, contentType, downloadName);
});

app.Map("/", () => "Hello World");

app.Run();

И при обращении по пути "/forest" пользователю будет отправлен файл forest.png под именем "winter_forest.png":

Отправка файлов и метод File в Results API в ASP.NET Core и C#

Отправка в виде файлового потока

Еще одна версия метода File() позволяет отправить данные в виде потока Stream:

public static IResult File (System.IO.Stream fileStream, string? contentType = default, 
string? fileDownloadName = default, DateTimeOffset? lastModified = default, 
Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);

Здесь меняется только первый параметр, который в данной версии представляет содержимое файла в виде объекта Stream. Остальные параметры остаются те же, что и в предыдущей версии

Также, как и в предыдущем примере, отправим файл forest.png из папки Files:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Map("/forest", () => 
{
    string path = "Files/forest.png";
    FileStream fileStream = new FileStream(path, FileMode.Open);
    string contentType = "image/png";
    string downloadName = "winter_forest.png";
    return Results.File(fileStream, contentType, downloadName);
});

app.Map("/", () => "Hello World");

app.Run();

Отправка файла по определенному пути

Если у нас есть путь к файлу, то проще использовать третью версию метода File(), которая в качествве первого параметра принимает путь к файлу:

public static IResult File (string path, string? contentType = default, 
string? fileDownloadName = default, DateTimeOffset? lastModified = default, 
Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = default, bool enableRangeProcessing = false);

Остальные параметры те же, что в ранее рассмотренных версиях метода. Однако стоит отметить, что данная версия метода вычисляет пути к файлам относительно папки, которая задается параметром WebRootPath - по умолчанию это папка wwwroot. То есть файл для отправки по умолчанию должен располагаться в этой папке:

Загрузка файла по пути и Results API в ASP.NET Core и C#

Используем эту версию метода для отправки файла wwwroot/Files/forest.png:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Map("/forest", () => 
{
    string path = "Files/forest.png";
    string contentType = "image/png";
    string downloadName = "winter_forest.png";
    return Results.File(path, contentType, downloadName);
});

app.Map("/", () => "Hello World");

app.Run();

Но это поведение мы можем переопределить. Допустим, в проекте есть папка Files. И мы хотим, чтобы приложение автоматически подхватывало из нее файлы.

Переустановка папки для отправки файла по пути и Results API в ASP.NET Core и C#

Для этого добавим новый каталог для статических файлов:

var builder = WebApplication.CreateBuilder(
    new WebApplicationOptions { WebRootPath = "Files" });  // добавляем папку для хранения файлов
var app = builder.Build();

app.Map("/river", () => 
{
    string path = "newRiver.jpg";
    string contentType = "image/jpeg";
    string downloadName = "river.jpg";
    return Results.File(path, contentType, downloadName);
});

app.Map("/", () => "Hello World");

app.Run();

В данном случае путь к файлу newRiver.jpg будет расчитываться относительно папки Files.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850