মিডিয়া আপলোড করুন

বেশ কিছু API পদ্ধতিতে রেগুলার বডির পাশাপাশি মিডিয়া আপলোড করার সুবিধা আছে। সেই ক্ষেত্রে, আপলোড করার জন্য অতিরিক্ত Stream পেতে, নিয়মিত অনুরোধের পদ্ধতি ওভারলোড করা হয়।

এক নজরে

আপনি যেকোনও Stream আপলোড করতে চাইলে, আপনাকে রেজুমেবল মিডিয়া আপলোড ব্যবহার করতে হবে, যা স্ট্রিমকে ছোট ছোট চাঙ্কে আপলোড করার অনুমতি দেয়। আপনি যদি বড় ফাইল ট্রান্সফার করেন এবং নেটওয়ার্ক বিঘ্নিত হওয়ার বা অন্য কোনও ট্রান্সমিশন ব্যর্থ হওয়ার সম্ভাবনা বেশি থাকে, তাহলে এটি বিশেষভাবে সহায়ক হয়। নেটওয়ার্ক কাজ না করলে এটি আপনার ব্যান্ডউইথের ব্যবহারও কমাতে পারে কারণ আপনাকে বড় ফাইল আপলোড করার প্রসেস শুরু থেকে আবার শুরু করতে হবে না।

ResumableMediaUpload

Google API .NET ক্লায়েন্ট লাইব্রেরিতে 1.2.0-beta ভার্সন থেকে 'রিজিউমেবল মিডিয়া আপলোড' ফিচারটি উপলভ্য আছে। Google API-নির্দিষ্ট লাইব্রেরিতে এই ফিচারের সাথে ইন্টার‍্যাক্ট করার জন্য সুবিধাজনক পদ্ধতি রয়েছে।

রেজিউমেবল মিডিয়া আপলোড প্রোটোকল সম্পর্কে, উদাহরণস্বরূপ, Drive API-এর জন্য মিডিয়া আপলোড পৃষ্ঠায় বর্ণনা করা হয়েছে। আগ্রহের প্রধান ক্লাস হল ResumableUpload। এই ইমপ্লিমেন্টেশনে, মিডিয়া কন্টেন্ট চাঙ্ক হিসেবে আপলোড করা হয়।

ডিফল্ট চাঙ্ক সাইজ হল ১০ এমবি, তবে আপনি অনুরোধে ChunkSize প্রপার্টি ২৫৬ কেবির যেকোনও গুণিতকে সেট করে এটি পরিবর্তন করতে পারবেন। কোনও অনুরোধে সার্ভারের সমস্যা দেখা দিলে, এক্সপোনেনশিয়াল ব্যাকঅফ নীতি ব্যবহার করে আপলোড না হওয়া বাইট আবার পাঠানো হয়। ডিফল্ট হিসেবে, প্রতিটি ক্লায়েন্ট অনুরোধের জন্য এক্সপোনেনশিয়াল ব্যাকঅফ চালু করা থাকে। আপনি যখন নতুন সার্ভিস অবজেক্ট তৈরি করেন তখন ডিফল্ট অ্যাকশন পরিবর্তন করতে পারেন। এটি করতে BaseClientService.Initializer-এ DefaultExponentialBackOffPolicy প্রপার্টি পরিবর্তন করুন এবং/অথবা HttpClientInitializer প্রপার্টি IConfigurableHttpClientInitializer-এর নিজস্ব ইমপ্লিমেন্টেশনে সেট করুন যা কিছু ব্যাকঅফ নীতি যোগ করে।

মিডিয়া আপলোড করার সুবিধা প্রদান করে এমন পদ্ধতিগুলি API-নির্দিষ্ট ডকুমেন্টেশনের জন্য রেফারেন্স ডকুমেন্টেশনে শনাক্ত করা হয়। এইসব API পদ্ধতির জন্য, কনভেনিয়েন্স Upload এবং UploadAsync পদ্ধতি যোগ করা হয়েছে। এইসব পদ্ধতিতে আপলোড করার জন্য একটি Stream এবং প্যারামিটার হিসেবে এর কন্টেন্টের ধরন লাগে।

আপনার আপলোড করা স্ট্রিমের পজিশন যেন 0 হয় তা নিশ্চিত করুন, অন্যথায় আপনি সমস্যা সংক্রান্ত মেসেজ পাবেন, যেমন "System.InvalidOperationException: প্রদত্ত হেডার খুঁজে পাওয়া যায়নি"।

মনে রাখবেন যে ফ্রেমওয়ার্কের 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");