หน้านี้จะอธิบายวิธีส่งคำขออัปโหลดที่ดำเนินการต่อไปยัง Google Photos Library API ต่อผ่านโปรโตคอล REST โปรโตคอลนี้ช่วยให้คุณดำเนินการอัปโหลดต่อได้หลังจากการสื่อสารไม่สำเร็จขัดจังหวะการไหลของข้อมูล
ใช้ตัวเลือกการอัปโหลดที่ดำเนินการต่อได้ในกรณีต่อไปนี้
- คุณอัปโหลดไฟล์ขนาดใหญ่
- โอกาสที่จะเกิดการหยุดชะงักของเครือข่ายหรือการส่งข้อมูลล้มเหลวอื่นๆ จะเป็นไปได้สูง (เช่น หากคุณกำลังอัปโหลดไฟล์จากแอปบนอุปกรณ์เคลื่อนที่)
การอัปโหลดที่กลับมาดำเนินการต่อได้ยังช่วยลดการใช้แบนด์วิดท์เมื่อเครือข่ายขัดข้องด้วย เนื่องจากคุณไม่จําเป็นต้องเริ่มการอัปโหลดไฟล์ขนาดใหญ่อีกครั้งตั้งแต่ต้น
ขั้นตอนที่ 1: เริ่มต้นเซสชันการอัปโหลด
เริ่มต้นเซสชันการอัปโหลดที่กลับมาทำงานอีกครั้งได้โดยการส่งคำขอ POST ไปยัง https://photoslibrary.googleapis.com/v1/uploads
อัปโหลดไฟล์โดยใช้ URL สำหรับการอัปโหลดต่อได้ซึ่งแสดงในคำขอนี้
คำขอ POST ต้องมีส่วนหัวต่อไปนี้
ช่องส่วนหัว | |
---|---|
Content-Length |
ตั้งค่าเป็น 0 เนื่องจากเนื้อหาของคำขอว่างเปล่า |
X-Goog-Upload-Command |
ตั้งค่าเป็น start |
X-Goog-Upload-Content-Type |
ตั้งค่าเป็นประเภท MIME ของไฟล์ เช่น
image/jpeg |
X-Goog-Upload-Protocol |
ตั้งค่าเป็น resumable |
X-Goog-Upload-Raw-Size |
กําหนดเป็นจํานวนไบต์ทั้งหมดของข้อมูลไฟล์ที่จะโอน |
ส่วนหัวคำขอ POST มีดังนี้
POST https://photoslibrary.googleapis.com/v1/uploads Authorization: Bearer oauth2-token Content-Length: 0 X-Goog-Upload-Command: start X-Goog-Upload-Content-Type: mime-type X-Goog-Upload-Protocol: resumable X-Goog-Upload-Raw-Size: bytes-of-file
ขั้นตอนที่ 2: บันทึก URL ของเซสชัน
หากสำเร็จ คำขอ POST จะแสดงรหัสสถานะ HTTP 200 OK
รวมถึงส่วนหัวต่อไปนี้
X-Goog-Upload-URL: url-to-make-uploads-to X-Goog-Upload-Chunk-Granularity: chunk-granularity-in-bytes
ช่องส่วนหัว x-goog-upload-chunk-granularity
มีการจัดแนวไบต์และความละเอียดของขนาดสำหรับกลุ่มข้อมูลทั้งหมดที่ส่งโดยไคลเอ็นต์ หากการอัปโหลดทำเป็นหลายกลุ่ม การอัปโหลดทั้งหมดยกเว้นการอัปโหลดครั้งล่าสุดจะต้องเป็นจำนวนที่คูณด้วยค่านี้ กล่าวคือ จำนวนไบต์การอัปโหลดของไฟล์ต้องสอดคล้องกับค่านี้ ในข้อมูลโค้ดสุดท้าย คุณจะอัปโหลดไบต์ที่เหลือได้
ช่องส่วนหัว X-Goog-Upload-URL
มี URL ที่ไม่ซ้ำกันซึ่งต้องใช้เพื่ออัปโหลดให้เสร็จสมบูรณ์ผ่านคำขอที่เหลือทั้งหมด คัดลอกและบันทึก URL ของเซสชันที่กลับมาดำเนินการต่อได้นี้เพื่อให้ใช้กับคำขอต่อๆ ไปได้
ขั้นตอนที่ 3: อัปโหลดไฟล์
การอัปโหลดไฟล์ด้วยเซสชันที่อัปโหลดต่อได้ทำได้ 2 วิธีดังนี้
- ในคําขอเดียว โดยทั่วไปแล้ว แนวทางนี้ถือเป็นแนวทางที่ดีที่สุด เนื่องจากมีคำขอน้อยกว่า จึงมีประสิทธิภาพดีกว่า
-
เป็นหลายกลุ่ม วิธีการนี้จะอัปโหลดในคำขอหลายรายการโดยแบ่งข้อมูลออกเป็นหลายกลุ่ม ระบบจะแบ่งข้อมูลเป็นกลุ่มๆ ทีละ
x-goog-upload-chunk-granularity
หากจำเป็น คุณจะลองส่งคำขอที่แบ่งส่วนนี้อีกครั้งได้ใช้แนวทางนี้ในกรณีต่อไปนี้
- คุณต้องลดจำนวนข้อมูลที่โอนในคำขอเดียว คุณอาจต้องดำเนินการนี้เมื่อมีการกำหนดเวลาตายตัวสำหรับคำขอแต่ละรายการ
- คุณต้องระบุตัวบ่งชี้ที่ปรับแต่งเองซึ่งแสดงความคืบหน้าของการอัปโหลด
- คุณจำเป็นต้องทราบว่าเมื่อใดที่ระบบจะลบข้อมูลทิ้งได้อย่างปลอดภัย
คำขอเดียว
วิธีอัปโหลดไฟล์ในคำขอเดียว
- สร้างคําขอ
POST
ไปยัง URL ของเซสชันที่กลับมาทํางานต่อได้ - เพิ่มข้อมูลของไฟล์ในเนื้อหาคำขอ
เพิ่มส่วนหัว HTTP ต่อไปนี้
Content-Length
: ตั้งค่าจำนวนไบต์ในไฟล์X-Goog-Upload-Command
: ตั้งค่าเป็นupload, finalize
ส่งคำขอ
หากคำขออัปโหลดขัดข้องหรือคุณได้รับการตอบกลับ5xx
ให้ทำตามขั้นตอนในการอัปโหลดที่หยุดชะงักอีกครั้ง
หากคำขอสำเร็จ คุณจะได้รับรหัสสถานะ HTTP 200 OK
และโทเค็นการอัปโหลดในเนื้อหาการตอบกลับ
สร้างรายการสื่อโดยใช้โทเค็นการอัปโหลดนี้
หลายกลุ่ม
วิธีอัปโหลดไฟล์เป็นหลายกลุ่ม
- สร้างคำขอ
POST
ไปยัง URL ของเซสชันที่ดำเนินการต่อได้ -
เพิ่มข้อมูลของข้อมูลไปยังเนื้อหาคำขอ
ยกเว้นข้อมูลส่วนสุดท้ายที่จะอัปโหลดให้เสร็จสมบูรณ์ ให้สร้างข้อมูลส่วนอื่นๆ เป็นจำนวนที่คูณกับขนาดของข้อมูลส่วนที่ระบบยอมรับ รักษาขนาดของกลุ่มให้ใหญ่ที่สุดเท่าที่จะเป็นไปได้เพื่อให้การอัปโหลดมีประสิทธิภาพ
-
เพิ่มส่วนหัว HTTP ต่อไปนี้
Content-Length
: ตั้งค่าเป็นจํานวนไบต์ในกลุ่มX-Goog-Upload-Command
: ตั้งค่าเป็นupload
สําหรับกลุ่มสุดท้าย ให้ตั้งค่าเป็นupload, finalize
X-Goog-Upload-Offset
: ตั้งค่าเป็นออฟเซตที่ควรเขียนไบต์ โปรดทราบว่าต้องอัปโหลดไบต์ทีละรายการ ส่วนออฟเซตแรกคือ0
- ส่งคำขอ
หากคำขออัปโหลดถูกขัดจังหวะหรือคุณได้รับการตอบกลับ
5xx
ให้ทำตามขั้นตอนในการกลับมาอัปโหลดต่อ - ทำขั้นตอนเหล่านี้ซ้ำสำหรับแต่ละกลุ่มที่เหลืออยู่ในไฟล์
หากคำขอสำเร็จ คุณจะได้รับรหัสสถานะ HTTP 200 OK
และโทเค็นการอัปโหลดในเนื้อหาการตอบกลับ
สร้างรายการสื่อโดยใช้โทเค็นการอัปโหลดนี้
ตัวอย่าง
คำขอเดียว
ตัวอย่างต่อไปนี้แสดงคำขอที่กลับมาดำเนินการต่อได้เพื่ออัปโหลดไฟล์ JPEG ขนาด 3,039,417 ไบต์ในคำขอเดียว
POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1 Content-Length: 0 X-Goog-Upload-Command: start X-Goog-Upload-Content-Type: image/jpeg X-Goog-Upload-Protocol: resumable X-Goog-Upload-Raw-Size: 3039417 [no body]
การตอบกลับจะมี URL การอัปโหลดและขนาดข้อมูลที่จะอัปโหลดตามที่ต้องการ
HTTP/1.1 200 OK X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable X-Goog-Upload-Chunk-Granularity: 262144
คำขออัปโหลดครั้งสุดท้าย
POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1 Content-Length: 3039417 X-Goog-Upload-Command: upload, finalize X-Goog-Upload-Offset: 0 [BYTES 0-4199999]
หลายกลุ่ม
ตัวอย่างต่อไปนี้แสดงคำขอที่กลับมาดำเนินการต่อได้เพื่ออัปโหลดไฟล์ JPEG ขนาด 3,039,417 ไบต์เป็นหลายกลุ่มโดยใช้ URL เซสชันที่กลับมาดำเนินการต่อได้และความละเอียดของขนาดกลุ่มที่ยอมรับซึ่งได้รับในขั้นตอนก่อนหน้า
ตัวอย่างนี้ใช้ขนาดของกลุ่มเป็น 262,144 ไบต์ ซึ่งแสดงผลในช่องส่วนหัว x-goog-upload-chunk-granularity
เมื่อเริ่มต้นเซสชันการอัปโหลด โปรดทราบว่าการอัปโหลดแต่ละครั้งมีไบต์ที่อยู่ในจำนวนพหุคูณของ 262,144
เริ่มต้นเซสชันการอัปโหลดเพื่อรับ URL การอัปโหลดและขนาดกลุ่มตามที่อธิบายไว้ในขั้นตอนก่อนหน้า
POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1 Content-Length: 0 X-Goog-Upload-Command: start X-Goog-Upload-Content-Type: image/jpeg X-Goog-Upload-Protocol: resumable X-Goog-Upload-Raw-Size: 3039417 [no body]
การตอบกลับจะมี URL การอัปโหลดและขนาดข้อมูลที่จะอัปโหลดตามที่ต้องการ
HTTP/1.1 200 OK X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable X-Goog-Upload-Chunk-Granularity: 262144
กลุ่มแรก:
POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1 Content-Length: 1048576 X-Goog-Upload-Command: upload X-Goog-Upload-Offset: 0 [BYTES 0-1048575]
ข้อมูลโค้ดที่ 2
POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1 Content-Length: 1048576 X-Goog-Upload-Command: upload X-Goog-Upload-Offset: 1048576 [BYTES 1048576-2097151]
ข้อมูลโค้ดล่าสุด:
POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1 Content-Length: 942265 X-Goog-Upload-Command: upload, finalize X-Goog-Upload-Offset: 2097152 [BYTES 2097152-4200000]
การอัปโหลดที่หยุดชะงักต่อ
หากคําขออัปโหลดถูกขัดจังหวะหรือคุณได้รับรหัสสถานะ HTTP ที่ไม่ใช่ 200
ให้ค้นหาเซิร์ฟเวอร์เพื่อดูว่าการอัปโหลดสําเร็จเพียงใด
นี่คือคำขอ POST
สำหรับ URL เซสชันที่กลับมาทำงานต่อได้ X-Goog-Upload-Command
ควรตั้งค่าเป็น query
POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1 Content-Length: 0 X-Goog-Upload-Command: query
การตอบกลับจากเซิร์ฟเวอร์จะมีรหัสสถานะ HTTP 200 OK
และขนาดการอัปโหลดปัจจุบัน
HTTP/1.1 200 OK X-Goog-Upload-Status: active X-Goog-Upload-Size-Received: 100
จากนั้นคุณจะกลับมาอัปโหลดต่อได้ที่ส่วนนี้ คุณต้องดำเนินการต่อในออฟเซ็ตที่เซิร์ฟเวอร์ให้ไว้ เว้นแต่ว่าคุณจะส่งคำสั่งการอัปโหลดแบบรวมและสรุป ซึ่งในกรณีนี้คุณสามารถดำเนินการต่อที่ออฟเซ็ต 0 ได้
หากมีส่วนหัว X-Goog-Upload-Status
ในการตอบกลับ HTTP ของคำสั่งการค้นหาและค่าไม่ใช่ active
แสดงว่าการอัปโหลดถูกยกเลิกแล้ว