上传用户文件
在下一练习中,你将扩展应用以支持文件上传。 有两种方法可以使用 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; }
让我们看看如何将这些不同部分组合在一起以支持文件上传。