Cargar archivos de usuario

Completado

En el ejercicio siguiente, ampliará la aplicación para admitir cargas de archivos. Hay dos maneras de cargar un archivo mediante Microsoft Graph. La manera más sencilla es usar una única solicitud PUT:

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

Sin embargo, este método está limitado a 4 MB. El método más complejo implica una serie de solicitudes HTTP como una “sesión de carga”. Afortunadamente, el SDK de Microsoft Graph hace que el método complejo sea más sencillo. El objeto bien llamado LargeFileUploadTask controla todos los detalles.

Para usar LargeFileUploadTask el objeto, primero se debe crear una sesión de carga:

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

La sesión de carga se pasa al LargeFileUploadTask constructor junto con la secuencia para cargar y el tamaño máximo del segmento. El valor de tamaño máximo de segmento debe ser un múltiplo de 320 KB:

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

Para realizar un seguimiento del progreso de carga del archivo, se puede crear un Progress objeto y pasarlo al UploadAsync método del LargeFileUploadTaskobjeto.

IProgress<long> progress = new Progress<long>(prog =>
{
  _logger.LogInformation($"Uploaded {prog} bytes of {stream.Length} bytes");
});

var uploadResult = await fileUploadTask.UploadAsync(progress);

Para iniciar la carga de archivos, se puede agregar un formulario HTML a la página web con una entrada y un botón de archivo:

<form method="post" enctype="multipart/form-data">
  <input asp-for="UploadedFile" type="file"></input>
  <input type="submit" value="Upload File"></input>
</form>

Cuando un usuario envía una carga de archivos, los datos se asignan a una propiedad denominada UploadedFile en el modelo de página de Razor denominado FilesModel. El nombre de la propiedad coincide con el asp-for valor definido en el control de entrada de archivo del formulario.

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

Veamos cómo se pueden juntar estas diferentes partes para admitir cargas de archivos.