อัปโหลดสื่อ

มีเมธอด API หลายวิธีที่รองรับการอัปโหลดสื่อนอกเหนือจากเนื้อหาปกติ ในกรณีนี้ เมธอดคำขอปกติจะทำงานหนักเกินไปเพื่อรับ Stream เพื่ออัปโหลด

ภาพรวม

สำหรับ Stream ใดๆ ที่ต้องการอัปโหลด คุณควรใช้ "ดำเนินการต่อได้" การอัปโหลดสื่อ ซึ่งช่วยให้สามารถอัปโหลดสตรีมในส่วนที่เล็กลง ซึ่งจะเป็นประโยชน์อย่างยิ่งหากคุณจะโอนไฟล์ขนาดใหญ่ และโอกาสที่เครือข่ายจะหยุดชะงักหรือการส่งข้อมูลอื่นๆ มีความล้มเหลวสูง นอกจากนี้ยังช่วยลดการใช้แบนด์วิดท์ในกรณีที่เครือข่ายขัดข้อง เพราะไม่ต้องเริ่มอัปโหลดไฟล์ขนาดใหญ่ใหม่ตั้งแต่ต้น

ResumableMediaUpload

การอัปโหลดสื่อที่ดำเนินการต่อได้เป็นฟีเจอร์ในคลังไคลเอ็นต์ .NET ของ Google API ตั้งแต่ 1.2.0-เบต้า ไลบรารีเฉพาะ API ของ Google มีวิธีการอำนวยความสะดวกสำหรับ การโต้ตอบกับฟีเจอร์นี้

ตัวอย่างเช่น มีการอธิบายโปรโตคอลการอัปโหลดสื่อที่กลับมาทำงานต่อได้ใน หน้าอัปโหลดสื่อสำหรับ Drive API ประเภทความสนใจหลักคือ ResumableUpload ในการใช้งานนี้ เนื้อหาสื่อจะได้รับการอัปโหลดทีละส่วน

ขนาดกลุ่มเริ่มต้นคือ 10 MB แต่คุณสามารถแก้ไขได้โดยทำดังนี้ การตั้งค่าพร็อพเพอร์ตี้ ChunkSize ในคำขอเป็นทวีคูณของ 256 KB หากพบข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ในคำขอ Exponential Backoff ระบบจะใช้นโยบายเพื่อส่งไบต์ที่อัปโหลดไม่สำเร็จอีกครั้ง โดยค่าเริ่มต้น ระบบจะเปิดใช้ Exponential Backoff สำหรับคำขอของไคลเอ็นต์แต่ละรายการ คุณสามารถเปลี่ยนลักษณะการทำงานเริ่มต้นเมื่อคุณสร้าง ออบเจ็กต์บริการใหม่โดยเปลี่ยน พร็อพเพอร์ตี้ DefaultExponentialBackOffPolicy บน BaseClientService.Initializer และ/หรือการตั้งค่า HttpClientInitializer เพื่อติดตั้งใช้งาน IConfigurableHttpClientInitializer ของคุณเอง ที่เพิ่มนโยบาย Backoff

ระบุวิธีการที่รองรับการอัปโหลดสื่อ ในเอกสารประกอบอ้างอิงสำหรับเอกสารประกอบเกี่ยวกับ 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");