Carregar arquivos de usuário
No próximo exercício, você estenderá o aplicativo para dar suporte ao upload de arquivos. Há duas maneiras de carregar um arquivo usando o Microsoft Graph. A maneira mais fácil é usar uma única solicitação PUT:
var driveItem = await _graphServiceClient
.Me.Drive.Root
.ItemWithPath(itemPath)
.Content
.Request()
.PutAsync<DriveItem>(stream);
Esse método é limitado a 4 MB. O método mais complexo envolve uma série de solicitações HTTP como uma sessão de upload. Felizmente, o Microsoft Graph SDK facilita esse método complexo. O objeto adequadamente nomeado LargeFileUploadTask
manipula todos os detalhes.
Para usar o objeto LargeFileUploadTask
, uma sessão de upload deve ser criada primeiro:
var uploadSession = await _graphServiceClient.Me.Drive.Root
.ItemWithPath(itemPath)
.CreateUploadSession(uploadProps)
.Request()
.PostAsync();
A sessão de upload é passada para o construtor LargeFileUploadTask
juntamente com o fluxo a ser carregado e o tamanho máximo da fatia. O valor de tamanho máximo da fatia deve ser um múltiplo de 320 KB:
int maxSliceSize = 320 * 1024;
var fileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSliceSize);
Para acompanhar o progresso do carregamento do arquivo, um objetoProgress
pode ser criado e passado para o método LargeFileUploadTask
do objeto UploadAsync
.
IProgress<long> progress = new Progress<long>(prog =>
{
_logger.LogInformation($"Uploaded {prog} bytes of {stream.Length} bytes");
});
var uploadResult = await fileUploadTask.UploadAsync(progress);
Para iniciar o carregamento do arquivo, um formulário HTML pode ser adicionado à página da Web com uma entrada de arquivo e um botão:
<form method="post" enctype="multipart/form-data">
<input asp-for="UploadedFile" type="file"></input>
<input type="submit" value="Upload File"></input>
</form>
Quando um usuário envia um carregamento de arquivo, os dados são atribuídos a uma propriedade chamada UploadedFile
no modelo de Página Razor denominado FilesModel
. O nome da propriedade corresponde ao valor asp-for
definido no controle de entrada de arquivo do formulário.
[BindProperty]
public IFormFile UploadedFile { get; set; }
Vamos examinar como essas diferentes partes podem ser reunidas para dar suporte a carregamentos de arquivos.