เมธอด API หลากหลายรองรับการอัปโหลดสื่อนอกเหนือจากเนื้อหาปกติ
ในกรณีดังกล่าว ระบบจะโหลดเมธอดคำขอปกติมากเกินไปจนได้รับ Stream
เพิ่มเติมเพื่ออัปโหลด
ภาพรวม
สำหรับ Stream
ที่ต้องการอัปโหลด คุณควรใช้การอัปโหลดสื่อที่ดำเนินการต่อได้ ซึ่งจะช่วยให้อัปโหลดสตรีมเป็นส่วนเล็กๆ ได้
ซึ่งจะเป็นประโยชน์อย่างยิ่งหากคุณโอนไฟล์ขนาดใหญ่ และมีโอกาสสูงที่เครือข่ายจะหยุดชะงักหรือการส่งข้อมูลล้มเหลวอื่นๆ สูง
นอกจากนี้ยังช่วยลดการใช้แบนด์วิดท์ในกรณีที่เครือข่ายล้มเหลว เนื่องจากคุณไม่ต้องรีสตาร์ทการอัปโหลดไฟล์ขนาดใหญ่ตั้งแต่ต้น
ResumableMediaUpload
การอัปโหลดสื่อที่กลับมาทำงานอีกครั้งเป็นฟีเจอร์ในไลบรารีของไคลเอ็นต์ .NET ของ Google API มาตั้งแต่ 1.2.0 รุ่นเบต้า ไลบรารีสำหรับ Google API โดยเฉพาะมีเมธอดอำนวยความสะดวกสำหรับการโต้ตอบกับฟีเจอร์นี้
ตัวอย่างเช่น เราได้อธิบายโปรโตคอลการอัปโหลดสื่อที่กลับมาใช้ได้อีกครั้งไว้ในหน้าการอัปโหลดสื่อสำหรับ Drive API
ประเภทความสนใจหลักคือ ResumableUpload
ในการใช้งานนี้ เนื้อหาสื่อจะได้รับการอัปโหลดเป็นกลุ่ม
ขนาดกลุ่มเริ่มต้นคือ 10 MB แต่คุณเปลี่ยนได้โดยตั้งค่าพร็อพเพอร์ตี้ ChunkSize
ในคำขอให้เป็นขนาดพหุคูณขนาดใดก็ได้ของ 256 KB
หากพบข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ในคำขอ ระบบจะใช้นโยบาย Exponential Backoff เพื่อส่งไบต์ที่อัปโหลดไม่สำเร็จอีกครั้ง
โดยปกติ Exponential Backoff จะเปิดใช้อยู่สำหรับคำขอของไคลเอ็นต์แต่ละรายการ
คุณสามารถเปลี่ยนลักษณะการทำงานเริ่มต้นเมื่อสร้างออบเจ็กต์บริการใหม่โดยเปลี่ยนพร็อพเพอร์ตี้
DefaultExponentialBackOffPolicy
ใน BaseClientService.Initializer
และ/หรือตั้งค่าพร็อพเพอร์ตี้
HttpClientInitializer
เป็นการใช้งาน IConfigurableHttpClientInitializer
ของคุณเอง ซึ่งจะเพิ่มนโยบายการย้อนกลับบางส่วน
วิธีการที่รองรับการอัปโหลดสื่อจะระบุอยู่ในเอกสารอ้างอิงสำหรับเอกสารประกอบเฉพาะ API
สำหรับเมธอด API เหล่านี้ ระบบจะเพิ่มเมธอด Upload
และ UploadAsync
เพื่อความสะดวก
วิธีการดังกล่าวจะใช้ Stream
ในการอัปโหลดและประเภทของเนื้อหาเป็นพารามิเตอร์
ตรวจสอบว่าตำแหน่งของสตรีมที่คุณอัปโหลดคือ 0 มิฉะนั้นคุณจะได้รับข้อผิดพลาด เช่น "System.InvalidEnforcementException: ไม่พบส่วนหัวที่ระบุ"
โปรดทราบว่าหากการอัปโหลดหมดเวลา ระบบจะส่ง TaskCanceledException
เนื่องจากลักษณะการทำงานของคลาส HttpClient
ของเฟรมเวิร์ก
หากเห็นข้อยกเว้นนี้ ให้พิจารณาเพิ่มพร็อพเพอร์ตี้ 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");