Medien hochladen

Mehrere API-Methoden unterstützen das Hochladen von Medien zusätzlich zu einem normalen Textkörper. In diesem Fall wird die reguläre Anfragemethode überladen, um eine zusätzliche Stream zum Hochladen abzurufen.

Übersicht

Für alle Stream, die Sie hochladen möchten, sollten Sie den fortsetzbaren Medienupload verwenden. Dadurch können Streams in kleineren Teilen hochgeladen werden. Dies ist besonders nützlich, wenn Sie große Dateien übertragen, und die Wahrscheinlichkeit einer Netzwerkunterbrechung oder einer anderen Übertragung Fehler hoch ist. Außerdem lässt sich damit die Bandbreitennutzung bei Netzwerkausfällen reduzieren. da Sie Uploads großer Dateien nicht neu starten müssen.

ResumableMediaUpload

Der fortsetzbare Medienupload ist seit der Version 1.2.0-Beta in der Google API .NET-Clientbibliothek verfügbar. Die Google API-spezifischen Bibliotheken enthalten praktische Methoden zum mit dieser Funktion interagieren.

Das fortsetzbare Medienupload-Protokoll wird beispielsweise auf der Seite zum Medienupload für die Drive API beschrieben. Die Hauptklasse ist ResumableUpload. Bei dieser Implementierung werden die Medieninhalte in mehreren Teilen hochgeladen.

Die Standard-Chunk-Größe beträgt 10 MB. Sie können sie ändern, indem Sie die ChunkSize-Eigenschaft in der Anfrage auf ein beliebiges Vielfaches von 256 KB festlegen. Wenn bei einer Anfrage ein Serverfehler auftritt, werden die nicht hochgeladenen Bytes mithilfe der exponentiellen Backoff-Richtlinie noch einmal gesendet. Standardmäßig ist der exponentielle Backoff für jede Clientanfrage aktiviert. Sie können das Standardverhalten beim Erstellen ein neues Dienstobjekt erstellen, indem Sie DefaultExponentialBackOffPolicy-Property auf BaseClientService.Initializer und/oder das Festlegen der HttpClientInitializer mit Ihrer eigenen Implementierung von IConfigurableHttpClientInitializer mit einer Backoff-Richtlinie.

Die Methoden, die den Medienupload unterstützen, sind in der Referenzdokumentation für die API-spezifische Dokumentation aufgeführt. Für diese API-Methoden werden die praktischen Methoden Upload und UploadAsync hinzugefügt. Diese Methoden benötigen einen Stream zum Hochladen und den zugehörigen Inhaltstyp als Parameter.

Achte darauf, dass die Position des hochgeladenen Streams 0 ist. Andernfalls erhältst du folgende Fehlermeldung: "System.UngültigeOperationAusnahme: Der angegebene Header wurde nicht gefunden."

Hinweis: Aufgrund des Verhaltens der HttpClient-Klasse des Frameworks wird bei einem Zeitüberschreitungsfehler beim Upload eine TaskCanceledException geworfen. Wenn Sie diese Ausnahme sehen, sollten Sie das Attribut Timeout manuell erhöhen in den von Ihrem Dienstobjekt verwendeten Client.

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