Medya Yükleme

Normal bir gövdenin yanı sıra medya yüklemeyi de destekleyen çeşitli API yöntemleri vardır. Bu durumda, yüklenecek ek bir Stream almak için normal istek yöntemi aşırı yüklenir.

Genel bakış

Yüklemek istediğiniz herhangi bir Stream için devam ettirilebilir medya yüklemeyi kullanmanız gerekir. Bu, akışların daha küçük parçalar halinde yüklenmesine olanak tanır. Bu, özellikle büyük dosyalar aktarıyorsanız ve ağ kesintisi veya başka bir iletim hatası olasılığı yüksek olduğunda yararlıdır. Büyük dosya yükleme işlemlerini baştan başlatma zorunluluğu olmadığından, ağ hataları olması durumunda bant genişliği kullanımınızı da azaltabilir.

ResumableMediaUpload

Devam Ettirilebilir Medya Yükleme, 1 .2.0 beta sürümünden beri Google API'nin.NET istemci kitaplığında yer alan bir özelliktir. Google API'ye özel kitaplıklar, bu özellikle etkileşime geçmek için uygun yöntemler içerir.

Devam ettirilebilir medya yükleme protokolü, örneğin Drive API'nin medya yükleme sayfasında açıklanmıştır. Ana ilgi alanı sınıfı ResumableUpload. Bu uygulamada medya içeriği parçalar halinde yüklenir.

Varsayılan yığın boyutu 10 MB'tır ancak istekteki ChunkSize özelliğini 256 KB'lık herhangi bir kat olarak ayarlayarak bunu değiştirebilirsiniz. İstekte bir sunucu hatasıyla karşılaşılırsa başarıyla yüklenmeyen baytları yeniden göndermek için üstel geri yükleme politikası kullanılır. Varsayılan olarak, her istemci isteği için üstel geri çekilme etkinleştirilir. Yeni bir hizmet nesnesi oluştururken BaseClientService.Initializer üzerindeki DefaultExponentialBackOffPolicy özelliğini değiştirerek ve/veya HttpClientInitializer özelliğini, geri yükleme politikası ekleyen kendi IConfigurableHttpClientInitializer uygulamanıza ayarlayarak varsayılan davranışı değiştirebilirsiniz.

Medya yüklemeyi destekleyen yöntemler, API'ye özel belgelerin referans dokümanlarında açıklanmıştır. Bu API yöntemleri için kolaylık Upload ve UploadAsync yöntemleri eklenir. Bu yöntemlerin yüklenmesi bir Stream, içerik türü ise parametre olarak kullanılır.

Yüklediğiniz akışın konumunun 0 olduğundan emin olun. Aksi takdirde, "System.Geçersizoperasyon: Belirtilen başlık bulunamadı" gibi bir hata alırsınız.

Çerçevenin HttpClient sınıfının davranışı nedeniyle, yükleme zaman aşımına uğrarsa bir TaskCanceledException öğesi atılır. Bu istisnayı görürseniz hizmet nesnenizin kullandığı istemcide Timeout özelliğini manuel olarak artırmayı düşünebilirsiniz.

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