Medien hochladen

Verschiedene API-Methoden unterstützen neben einem regulären Textkörper das Hochladen von Medien. In diesem Fall wird die reguläre Anfragemethode überlastet, um eine zusätzliche Stream hochzuladen.

Überblick

Für jeden Stream, den Sie hochladen möchten, sollten Sie einen fortsetzbaren Medien-Upload verwenden. Damit können Streams in kleineren Blöcken hochgeladen werden. Dies ist besonders nützlich, wenn Sie große Dateien übertragen und die Wahrscheinlichkeit einer Netzwerkunterbrechung oder eines anderen Übertragungsfehlers hoch ist. Außerdem kann dadurch die Bandbreitennutzung bei Netzwerkausfällen reduziert werden, da Sie große Dateiuploads nicht von Anfang an neu starten müssen.

ResumableMediaUpload

Resumable Media Upload ist seit der Betaversion 1 .2.0 eine Funktion in der.NET-Clientbibliothek der Google API. Die Google API-spezifischen Bibliotheken enthalten praktische Methoden für die Interaktion mit dieser Funktion.

Das Protokoll für fortsetzbare Medienuploads wird beispielsweise auf der Medien-Uploadseite für die Drive API beschrieben. Die wichtigste Klasse von Interesse ist ResumableUpload. Bei dieser Implementierung werden die Medieninhalte in Teilen hochgeladen.

Die Standardgröße für Chunks beträgt 10 MB. Sie können sie jedoch ändern, indem Sie das Attribut ChunkSize in der Anfrage auf ein Vielfaches von 256 KB setzen. Wenn in einer Anfrage ein Serverfehler auftritt, wird die Richtlinie für den exponentiellen Backoff verwendet, um die Byte, die nicht erfolgreich hochgeladen wurden, noch einmal zu senden. Der exponentielle Backoff ist standardmäßig für jede Clientanfrage aktiviert. Sie können das Standardverhalten beim Erstellen eines neuen Dienstobjekts ändern. Ändern Sie dazu das Attribut DefaultExponentialBackOffPolicy auf BaseClientService.Initializer und/oder legen Sie das Attribut HttpClientInitializer auf Ihre eigene Implementierung von IConfigurableHttpClientInitializer fest, mit der eine Backoff-Richtlinie hinzugefügt wird.

Die Methoden, die das Hochladen von Medien unterstützen, sind in der Referenzdokumentation zur API-spezifischen Dokumentation aufgeführt. Für diese API-Methoden wurden die praktischen Methoden Upload und UploadAsync hinzugefügt. Diese Methoden verwenden ein Stream zum Hochladen und den Inhaltstyp als Parameter.

Achten Sie darauf, dass die Position des hochgeladenen Streams 0 ist. Andernfalls wird eine Fehlermeldung wie „System.InvalidOperationException: Der angegebene Header nicht gefunden“ angezeigt.

Aufgrund des Verhaltens der HttpClient-Klasse des Frameworks wird bei einer Zeitüberschreitung beim Upload ein TaskCanceledException-Fehler ausgelöst. Wenn diese Ausnahme auftritt, sollten Sie das Attribut Timeout im von Ihrem Dienstobjekt verwendeten Client manuell erhöhen.

Beispielcode

// 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");