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

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

खास जानकारी

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

ResumableMediaUpload

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

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

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

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

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

ध्यान दें कि फ़्रेमवर्क की 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");