上传用户文件

已完成

在下一练习中,你将扩展应用以支持文件上传。 有两种方法可以使用 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; }

让我们看看如何将这些不同部分组合在一起以支持文件上传。