Отправка файлов пользователей
В следующем упражнении вы добавите в приложение функцию отправки файлов. Существует два способа отправки файлов с помощью 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; }
Давайте рассмотрим, как объединить эти различные части для поддержки отправки файлов.