Отправка файлов пользователей

Завершено

В следующем упражнении вы добавите в приложение функцию отправки файлов. Существует два способа отправки файлов с помощью Microsoft Graph. Самый простой способ — использовать один запрос PUT:

var driveItem = await _graphServiceClient
    .Me.Drive.Root
    .ItemWithPath(itemPath)
    .Content
    .Request()
    .PutAsync<DriveItem>(stream);

Однако при использовании этого метода можно передавать файлы размером не более 4 МБ. Более сложный метод подразумевает создание ряда HTTP-запросов в рамках "сеанса отправки". К счастью, пакет SDK Microsoft Graph позволяет упростить этот метод! Объект aptly с именем LargeFileUploadTask обрабатывает все сведения.

Чтобы использовать объект LargeFileUploadTask, сначала необходимо создать сеанс отправки:

var uploadSession = await _graphServiceClient.Me.Drive.Root
    .ItemWithPath(itemPath)
    .CreateUploadSession(uploadProps)
    .Request()
    .PostAsync();

Сеанс отправки передается в конструктор LargeFileUploadTask вместе с потоком для отправки и максимальным размером среза. Максимальное значение размера среза должно быть кратным 320 КБ:

int maxSliceSize = 320 * 1024;
var fileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSliceSize);

Чтобы отслеживать ход отправки файла, можно создать и передать объект Progress в метод UploadAsync объекта LargeFileUploadTask.

IProgress<long> progress = new Progress<long>(prog =>
{
  _logger.LogInformation($"Uploaded {prog} bytes of {stream.Length} bytes");
});

var uploadResult = await fileUploadTask.UploadAsync(progress);

Чтобы начать отправку файла, на веб-страницу можно добавить HTML-форму с элементом управления вводом файла и кнопкой:

<form method="post" enctype="multipart/form-data">
  <input asp-for="UploadedFile" type="file"></input>
  <input type="submit" value="Upload File"></input>
</form>

Когда пользователь отправляет файл, данные назначаются свойству UploadedFile в модели Razor Page с именем FilesModel. Имя свойства совпадает со значением asp-for, определенным в элементе управления вводом файла формы.

[BindProperty]
public IFormFile UploadedFile { get; set; }

Давайте рассмотрим, как объединить эти различные части для поддержки отправки файлов.