อัปโหลดสื่อ

เมธอด 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");