המדיה שהעלית

כמה שיטות API תומכות בהעלאת מדיה בנוסף לגוף סטנדרטי. במקרה כזה, יש עומס יתר על שיטת הבקשה הרגילה כדי לקבל Stream להעלאה.

סקירה כללית

בכל Stream שרוצים להעלות, צריך להשתמש שניתן להמשיך העלאת מדיה, שמאפשרת להעלות שידורי סטרימינג במקטעי נתונים קטנים יותר. האפשרות הזו שימושית במיוחד אם מעבירים קבצים גדולים, והסיכוי להפרעה ברשת או לכשל אחר בהעברה גבוה. הוא גם יכול לצמצם את השימוש ברוחב הפס במקרה של כשלים ברשת כי אין צורך להפעיל מחדש העלאות קבצים גדולות מההתחלה.

ResumableMediaUpload

'העלאת מדיה שניתן להמשיך' הוגדרה כתכונה בספריית הלקוח של Google API .NET מגרסת 1.2.0 בטא. הספריות הספציפיות ל-Google API מכילות שיטות נוחות אינטראקציה עם התכונה הזו.

פרוטוקול ההעלאה של מדיה שניתן להמשיך ממנו מתואר, למשל, בדף ההעלאה של מדיה ל-Drive API. הכיתה הראשית של העניין היא ResumableUpload. בהטמעה הזו, תוכן המדיה מועלה במקטעים.

גודל ברירת המחדל של מקטע הנתונים הוא 10MB, אבל אפשר לשנות אותו כך הגדרה של המאפיין ChunkSize בבקשה לכל כפולה של 256KB. אם מתרחשת שגיאת שרת בבקשה, המערכת משתמשת במדיניות השהיה מעריכית לפני ניסיון חוזר כדי לשלוח מחדש את הבייטים שלא הועברו בהצלחה. כברירת מחדל, השהיה מעריכית לפני ניסיון חוזר (exponential backoff) מופעלת לכל בקשת לקוח. אפשר לשנות את התנהגות ברירת המחדל כשיוצרים את אובייקט שירות חדש על ידי שינוי של האובייקט נכס DefaultExponentialBackOffPolicy בדומיין BaseClientService.Initializer ו/או הגדרה HttpClientInitializer נכס ליישום משלכם של IConfigurableHttpClientInitializer שמוסיפה מדיניות של השהיה לפני ניסיון חוזר (backoff).

זוהו השיטות שתומכות בהעלאה של מדיה במסמכי העזרה הספציפיים ל-API. לשיטות ה-API האלה נוספות שיטות נוחות Upload ו-UploadAsync. השיטות האלה מקבלות פרמטרים של Stream להעלאה וסוג התוכן שלו.

חשוב לוודא שהמיקום של הסטרימינג שאתם מעלים הוא 0, אחרת תקבלו הודעת שגיאה כמו "System.ValidOperationError: The given a header לא נמצאה".

שימו לב שבגלל ההתנהגות של הכיתה 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");