मीडिया फ़ाइल अपलोड करें

एपीआई के कई तरीके, सामान्य मुख्य हिस्से के अलावा मीडिया अपलोड करने में भी मदद करते हैं. ऐसे मामले में, अनुरोध का सामान्य तरीका ओवरलोड हो जाता है, ताकि अपलोड करने के लिए एक और Stream मिल सके.

खास जानकारी

आपको जिस Stream को अपलोड करना है उसके लिए, आपको फिर से शुरू किए जा सकने वाले मीडिया अपलोड का इस्तेमाल करना चाहिए. इससे स्ट्रीम को छोटे-छोटे हिस्सों में अपलोड किया जा सकता है. यह सुविधा खास तौर पर तब मददगार होती है, जब बड़ी फ़ाइलें ट्रांसफ़र की जा रही हों. साथ ही, नेटवर्क में रुकावट या ट्रांसमिशन न होने की आशंका भी ज़्यादा हो. अगर नेटवर्क काम नहीं कर रहा है, तो बैंडविथ का इस्तेमाल भी कम किया जा सकता है. ऐसा इसलिए होता है, क्योंकि आपको बड़ी फ़ाइलों को शुरू से अपलोड करने की ज़रूरत नहीं होती.

ResumableMediaUpload

फिर से शुरू करने लायक मीडिया अपलोड, 1 .2.0-बीटा वर्शन से Google API.NET क्लाइंट लाइब्रेरी की सुविधा रही है. Google API की खास लाइब्रेरी में, इस सुविधा का इस्तेमाल करने के आसान तरीके मौजूद हैं.

फिर से शुरू किए जा सकने वाले मीडिया अपलोड प्रोटोकॉल के बारे में बताया गया है. उदाहरण के लिए, Drive API के लिए मीडिया अपलोड पेज पर. दिलचस्पी वाली मुख्य कैटगरी ResumableUpload है. इस प्रोसेस में, मीडिया कॉन्टेंट को कई हिस्सों में अपलोड किया जाता है.

डेटा का डिफ़ॉल्ट हिस्सा 10 एमबी होता है. हालांकि, इसे बदला जा सकता है. इसके लिए, अनुरोध पर ChunkSize प्रॉपर्टी को 256 केबी के मल्टीपल पर सेट करें. अगर अनुरोध में सर्वर की कोई गड़बड़ी मिलती है, तो जो बाइट अपलोड नहीं हो सकीं उन्हें फिर से भेजने के लिए, एक्स्पोनेंशियल बैकऑफ़ नीति का इस्तेमाल किया जाता है. डिफ़ॉल्ट रूप से, हर क्लाइंट अनुरोध के लिए एक्स्पोनेंशियल बैकऑफ़ चालू होता है. कोई नया सेवा ऑब्जेक्ट बनाते समय, डिफ़ॉल्ट व्यवहार को बदला जा सकता है. ऐसा करने के लिए, BaseClientService.Initializer पर DefaultExponentialBackOffPolicy प्रॉपर्टी को बदलें और/या IConfigurableHttpClientInitializer को अपने लागू करने के तरीके से HttpClientInitializer प्रॉपर्टी सेट करें. इससे, बैकऑफ़ की कुछ नीति जोड़ी जा सकती है.

एपीआई से जुड़े दस्तावेज़ के लिए, रेफ़रंस दस्तावेज़ में मीडिया अपलोड करने के तरीकों के बारे में बताया गया है. एपीआई के इन तरीकों के लिए, सुविधा के Upload और UploadAsync तरीके जोड़े गए हैं. इन तरीकों में, अपलोड करने के लिए Stream होता है. साथ ही, इसके कॉन्टेंट टाइप को पैरामीटर के तौर पर इस्तेमाल किया जाता है.

पक्का करें कि अपलोड की जाने वाली स्ट्रीम की जगह 0 हो. ऐसा न करने पर, आपको गड़बड़ी का मैसेज मिलेगा. जैसे, "System. invalidOperation खूबसूरत: दिए गए हेडर को नहीं ढूंढा गया है".

ध्यान दें कि फ़्रेमवर्क की HttpClient क्लास के काम करने की वजह से, अपलोड का समय खत्म होने पर, TaskCanceledException को निकाल दिया जाता है. अगर आपको यह अपवाद दिखता है, तो आपके सेवा ऑब्जेक्ट के लिए इस्तेमाल किए जाने वाले क्लाइंट में Timeout प्रॉपर्टी को मैन्युअल तरीके से बढ़ाने के बारे में सोचें.

नमूना कोड

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