Przesyłane multimedia

Istnieje kilka metod interfejsu API, które umożliwiają przesyłanie multimediów, a nie tylko w przypadku zwykłych treści. W takim przypadku zwykła metoda żądania jest przeciążona, aby uzyskać dodatkowy Stream do przesłania.

Omówienie

W przypadku Stream, które chcesz przesłać, użyj opcji Wznów funkcję przesyłania multimediów, która umożliwia przesyłanie strumieni w mniejszych fragmentach. Jest to szczególnie przydatne, jeśli przesyłasz duże pliki, a prawdopodobieństwo przerwania transmisji lub wystąpienia innego błędu jest wysokie. Możesz też zmniejszyć wykorzystanie przepustowości w przypadku awarii sieci, ponieważ nie musisz ponownie rozpoczynać przesyłania dużych plików.

ResumableMediaUpload

Przerywane przesyłanie multimediów jest dostępne w bibliotece klienta interfejsu API Google w wersji .NET od wersji 1.2.0-beta. Biblioteki związane z interfejsami API Google zawierają wygodne metody podczas interakcji z tą funkcją.

Protokół przesyłania multimediów z możliwością wznowienia jest opisany na przykład na stronie stronie przesyłania multimediów dla interfejsu Drive API. Główna klasa, która nas interesuje, toResumableUpload. W tej implementacji treści multimedialne są przesyłane partiami.

Domyślny rozmiar fragmentu to 10 MB, ale możesz go zmienić, ustawiając w żądaniu właściwość ChunkSize na dowolną wielokrotność 256 KB. Jeśli w żądaniu wystąpi błąd serwera, do ponownego wysłania bajtów, które nie zostały przesłane, używana jest zasada sterowania spadkiem współczynnika. Domyślnie dla każdego żądania klienta funkcja wzrastającego ponowienia jest włączona. Możesz zmienić domyślne zachowanie podczas tworzenia nowego obiektu usługi, zmieniając Usługa DefaultExponentialBackOffPolicy w domenie BaseClientService.Initializer lub ustawienie parametru HttpClientInitializer z własną implementacją IConfigurableHttpClientInitializer dodający zasady ponowienia.

Metody, które obsługują przesyłanie multimediów, są opisane w dokumentacji referencyjnej konkretnego interfejsu API. W przypadku tych metod interfejsu API dodano metody UploadUploadAsync. Przesyłanie danych w przypadku tych metod wymaga parametru Stream i określonego typu treści.

Upewnij się, że pozycja przesyłanego strumienia wynosi 0. W przeciwnym razie pojawi się błąd: „System.InvalidOperationException: Nie znaleziono podanego nagłówka”.

Pamiętaj, że ze względu na działanie HttpClient platformy , a w przypadku przekroczenia limitu czasu przesyłania przesyłane jest żądanie TaskCanceledException. Jeśli widzisz ten wyjątek, spróbuj ręcznie zwiększyć wartość właściwości Timeout w klienta używanego przez obiekt usługi.

Przykładowy kod

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