Carregar arquivos de usuário

Concluído

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.