چندین روش API از آپلود رسانه علاوه بر یک بدنه معمولی پشتیبانی می کنند. در آن صورت، روش درخواست منظم بیش از حد بارگذاری می شود تا یک Stream
اضافی برای آپلود دریافت شود.
نمای کلی
برای هر Stream
که میخواهید آپلود کنید، باید از بارگذاری مجدد رسانه استفاده کنید، که اجازه میدهد جریانها در تکههای کوچکتر آپلود شوند. این به ویژه در صورتی مفید است که فایلهای بزرگی را انتقال میدهید و احتمال قطع شدن شبکه یا سایر خرابیهای انتقال زیاد است. همچنین می تواند استفاده از پهنای باند شما را در صورت خرابی شبکه کاهش دهد زیرا مجبور نیستید بارگذاری فایل های بزرگ را از ابتدا مجدداً راه اندازی کنید.
ResumableMediaUpload
Resumable Media Upload از نسخه 1.2.0-بتا یک ویژگی در کتابخانه سرویس گیرنده Google API .NET بوده است. کتابخانههای مخصوص Google API حاوی روشهای راحت برای تعامل با این ویژگی هستند.
پروتکل بارگذاری رسانه قابل ازسرگیری، به عنوان مثال، در صفحه بارگذاری رسانه برای Drive API توضیح داده شده است. کلاس اصلی مورد علاقه ResumableUpload
است. در این پیاده سازی، محتوای رسانه به صورت تکه ای آپلود می شود.
اندازه پیشفرض قطعه 10 مگابایت است، اما میتوانید با تنظیم ویژگی ChunkSize
در درخواست روی هر مضربی از 256 کیلوبایت، آن را تغییر دهید. اگر در یک درخواست با خطای سرور مواجه شد، از سیاست عقب نشینی نمایی برای ارسال مجدد بایت هایی که با موفقیت آپلود نشده اند استفاده می شود. به طور پیش فرض، عقب نشینی نمایی برای هر درخواست مشتری فعال است. میتوانید با تغییر ویژگی DefaultExponentialBackOffPolicy
در BaseClientService.Initializer
و/یا تنظیم ویژگی 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");