Importer du contenu multimédia

Plusieurs méthodes d'API permettent d'importer des contenus multimédias en plus d'un corps standard. Dans ce cas, la méthode de requête standard est surchargée pour obtenir un Stream supplémentaire à importer.

Présentation

Pour chaque Stream que vous souhaitez importer, vous devez utiliser l'importation de médias avec reprise, ce qui permet d'importer des flux en plus petits segments. Cela est particulièrement utile si vous transférez des fichiers volumineux et que la probabilité d'une interruption du réseau ou d'un autre échec de transmission est élevée. Cela peut également réduire l'utilisation de la bande passante en cas de défaillance du réseau, car vous n'avez pas besoin de redémarrer les importations de fichiers volumineux depuis le début.

ResumableMediaUpload

La fonctionnalité Resumable Media Upload est disponible dans la bibliothèque cliente .NET de l'API Google depuis la version 1.2.0-beta. Les bibliothèques spécifiques aux API Google contiennent des méthodes pratiques pour interagir avec cette fonctionnalité.

Le protocole d'importation de fichiers multimédias avec reprise est décrit, par exemple, sur la page d'importation de fichiers multimédias pour l'API Drive. La principale classe d'intérêt est ResumableUpload. Dans cette implémentation, le contenu multimédia est importé en fragments.

La taille par défaut des fragments est de 10 Mo, mais vous pouvez la modifier en définissant la propriété ChunkSize de la requête sur n'importe quel multiple de 256 Ko. Si une erreur de serveur se produit dans une requête, la règle d'intervalle exponentiel entre les tentatives est utilisée pour renvoyer les octets qui n'ont pas été importés correctement. Par défaut, l'intervalle exponentiel entre les tentatives est activé pour chaque requête client. Pour modifier le comportement par défaut lorsque vous créez un objet de service, modifiez la propriété DefaultExponentialBackOffPolicy sur BaseClientService.Initializer et/ou définissez la propriété HttpClientInitializer sur votre propre implémentation de IConfigurableHttpClientInitializer, ce qui ajoute une règle d'intervalle entre les tentatives.

Les méthodes compatibles avec l'importation de médias sont identifiées dans la documentation de référence de la documentation spécifique à l'API. Pour ces méthodes d'API, les méthodes Upload et UploadAsync pratiques sont ajoutées. Ces méthodes utilisent un Stream pour l'importation et son type de contenu en tant que paramètres.

Assurez-vous que la position du flux que vous importez est 0. Sinon, vous recevrez un message d'erreur du type "System.InvalidOperationException: The provided header was not found".

Notez qu'en raison du comportement de la classe HttpClient du framework, si l'importation expire, une erreur TaskCanceledException est générée. Si vous voyez cette exception, envisagez d'augmenter manuellement la propriété Timeout dans le client utilisé par votre objet de service.

Exemple de code

// Create the service using the client credentials.
var service = new DriveService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "Application_Name"
});

using var uploadStream = System.IO.File.OpenRead("Local_File_Name");

// Create the File resource to upload.
Google.Apis.Drive.v3.Data.File driveFile = new Google.Apis.Drive.v3.Data.File
{
    Name = "Drive_File_Name"
};
// Get the media upload request object.
FilesResource.CreateMediaUpload insertRequest = service.Files.Create(
    driveFile, uploadStream, "image/jpeg");

// Add handlers which will be notified on progress changes and upload completion.
// Notification of progress changed will be invoked when the upload was started,
// on each upload chunk, and on success or failure.
insertRequest.ProgressChanged += Upload_ProgressChanged;
insertRequest.ResponseReceived += Upload_ResponseReceived;

await insertRequest.UploadAsync();

static void Upload_ProgressChanged(IUploadProgress progress) =>
    Console.WriteLine(progress.Status + " " + progress.BytesSent);

static void Upload_ResponseReceived(Google.Apis.Drive.v3.Data.File file) =>
    Console.WriteLine(file.Name + " was uploaded successfully");