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