上傳使用者檔案

已完成

在下一個練習中,您將延伸應用程式,以支援檔案上傳。 使用 Microsoft Graph 上傳檔案有兩個方法。 最簡單的方法是使用單一 PUT 要求:

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

不過,此方法有 4 MB 的限制。 較複雜的方法涉及一系列的 HTTP 要求,做為「上傳工作階段」。 幸好,Microsoft Graph SDK 讓複雜的方法變得簡單易懂! 適當命名的 LargeFileUploadTask 物件會處理所有詳細資料。

若要使用 LargeFileUploadTask 物件,必須先建立上傳上傳:

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

上傳工作階段會傳入 LargeFileUploadTask 建構函式,以及要上傳的資料流和最大配量大小。 配量大小上限值必須是 320 KB 的倍數:

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

若要追蹤檔案上傳進度,可以建立 Progress 物件,並將它傳遞至 LargeFileUploadTask 物件的 UploadAsync 方法。

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>

當使用者提交檔案上傳時,會將資料指派給名為 FilesModel 的 Razor 頁面模型中名爲 UploadedFile 的屬性。 屬性的名稱與表單的檔案輸入控制項中所定義的 asp-for 值相符。

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

讓我們來看看如何將這些不同的部分放在一起,以支援檔案上傳。