המדיה שהעלית

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

סקירה כללית

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

ResumableMediaUpload

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

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

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

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

חשוב לוודא שהמיקום של מקור הנתונים שמעלים הוא 0. אחרת, תתקבל הודעת שגיאה כמו "System. invalidOperation הקשורה: הכותרת הנתונה לא נמצאה".

שימו לב שבשל ההתנהגות של המחלקה HttpClient של ה-framework, אם הזמן הקצוב להעלאה פג, המערכת מוסיפה 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");