Hochladen von Benutzerdateien

Abgeschlossen

In der nächsten Übung werden Sie die App erweitern, um das Hochladen von Dateien zu unterstützen. Es gibt zwei Möglichkeiten, wie Sie eine Datei mit Microsoft Graph hochladen können. Die einfachste Möglichkeit besteht darin, eine einzelne PUT-Anforderung zu verwenden:

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

Diese Methode ist jedoch auf 4 MB begrenzt. Die komplexere Methode umfasst eine Reihe von HTTP-Anforderungen als eine „Upload-Sitzung“. Glücklicherweise macht Microsoft Graph-SDK diese komplexe Methode einfacher. Das treffend benannte LargeFileUploadTask-Objekt kümmert sich um alle Details.

Um das LargeFileUploadTask-Objekt zu verwenden, muss zuerst eine Uploadsitzung erstellt werden:

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

Die Uploadsitzung wird zusammen mit dem hochzuladenden Datenstrom und der maximalen Segmentgröße an den LargeFileUploadTask-Konstruktor übergeben. Der maximale Segmentgrößenwert muss ein Vielfaches von 320 KB sein:

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

Um den Fortschritt des Dateiuploads nachzuverfolgen, kann ein Progress-Objekt erstellt und an die UploadAsync-Methode des LargeFileUploadTask-Objekts übergeben werden.

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

var uploadResult = await fileUploadTask.UploadAsync(progress);

Um den Dateiupload zu starten, kann der Webseite ein HTML-Formular mit einer Dateieingabe und einer Schaltfläche hinzugefügt werden:

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

Wenn ein Benutzer einen Dateiupload übermittelt, werden die Daten einer Eigenschaft namens UploadedFile im Razor Page-Modell mit dem Namen FilesModel zugewiesen. Der Name der Eigenschaft stimmt mit dem asp-for-Wert überein, der im Dateieingabesteuerelement des Formulars definiert ist.

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

Sehen wir uns an, wie diese verschiedenen Teile zusammengesetzt werden können, um das Hochladen von Dateien zu unterstützen.