Przesyłane multimedia

Kilka metod interfejsu API obsługuje przesyłanie multimediów oprócz zwykłej treści. W takim przypadku zwykła metoda żądania jest przeciążona, aby uzyskać dodatkowe Stream do przesłania.

Opis

W przypadku każdego rodzaju Stream, który chcesz przesłać, użyj funkcji wznawiania przesyłania multimediów, która umożliwia przesyłanie strumieni w mniejszych częściach. Jest to szczególnie przydatne, gdy przesyłasz duże pliki, a prawdopodobieństwo przerwy w działaniu sieci lub innej awarii przesyłania jest wysokie. Może też zmniejszyć wykorzystanie przepustowości w przypadku awarii sieci, ponieważ nie trzeba będzie ponownie uruchamiać przesyłania dużych plików.

ResumableMediaUpload

Możliwość wznawiania przesyłania multimediów jest funkcją w bibliotece klienta .NET interfejsu API Google od wersji 1.2.0 w wersji beta. Biblioteki interfejsów API Google zawierają wygodne metody interakcji z tą funkcją.

Protokół przesyłania multimediów wznawianych jest opisany na przykład na stronie przesyłania multimediów przez interfejs Drive API. Główną klasą interesującą użytkownika jest ResumableUpload. W tej implementacji treści multimedialne są przesyłane w częściach.

Domyślny rozmiar fragmentu to 10 MB, ale możesz go zmienić, ustawiając w żądaniu dowolną wartość we właściwości ChunkSize na dowolną wielokrotność 256 KB. Jeśli w żądaniu wystąpi błąd serwera, stosowana jest zasada wykładniczego ponowienia do ponownego wysłania bajtów, które nie zostały przesłane. Domyślnie wzrastający czas ponowienia jest włączony dla każdego żądania klienta. Podczas tworzenia nowego obiektu usługi możesz zmienić domyślne działanie, zmieniając właściwość DefaultExponentialBackOffPolicy w BaseClientService.Initializer lub ustawiając właściwość HttpClientInitializer na własną implementację IConfigurableHttpClientInitializer, która dodaje zasadę wycofywania.

Metody, które obsługują przesyłanie multimediów, zostały wymienione w dokumentacji interfejsu API. Do tych metod interfejsu API dodano wygodne metody Upload i UploadAsync. Te metody wykorzystują do przesyłania plik Stream, a jego typ treści – jako parametry.

Upewnij się, że pozycja przesyłanego strumienia to 0. W przeciwnym razie pojawi się błąd, taki jak „System.InvalidOperation obrazów: nie znaleziono określonego nagłówka”.

Pamiętaj, że ze względu na działanie klasy HttpClient platformy, jeśli limit czasu przesyłania zostanie przekroczony, zgłaszany jest TaskCanceledException. Jeśli widzisz ten wyjątek, możesz ręcznie zwiększyć właściwość Timeout w kliencie używanym 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");