آپلود رسانه

چندین روش 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");