การอัปโหลดรายการสื่อเป็นกระบวนการ 2 ขั้นตอน ดังนี้
- อัปโหลดไบต์ของไฟล์สื่อไปยังเซิร์ฟเวอร์ของ Google โดยใช้ปลายทาง uploads ซึ่งจะแสดงผลโทเค็นการอัปโหลดที่ระบุไบต์ที่อัปโหลด
- ใช้การเรียกใช้ batchCreate กับโทเค็นการอัปโหลดเพื่อ สร้างรายการสื่อในบัญชี Google Photos ของผู้ใช้
ขั้นตอนเหล่านี้จะอธิบายกระบวนการอัปโหลดรายการสื่อรายการเดียว หากคุณกำลังอัปโหลดรายการสื่อหลายรายการ (ซึ่งมีแนวโน้มสูงสำหรับแอปพลิเคชันการผลิต) โปรดอ่านแนวทางปฏิบัติแนะนำสำหรับการอัปโหลดเพื่อปรับปรุงประสิทธิภาพการอัปโหลด
ก่อนเริ่มต้น
ขอบเขตการให้สิทธิ์ที่จำเป็น
การอัปโหลดรายการสื่อไปยังคลังหรืออัลบั้มของผู้ใช้ต้องใช้ขอบเขต photoslibrary.appendonly ดูข้อมูลเพิ่มเติมเกี่ยวกับขอบเขตได้ที่
ขอบเขตการให้สิทธิ์
ประเภทและขนาดไฟล์ที่ยอมรับ
คุณอัปโหลดไฟล์ประเภทที่แสดงในตารางนี้ได้
| ประเภทสื่อ | ประเภทไฟล์ที่ยอมรับ | ขนาดไฟล์สูงสุด |
|---|---|---|
| Photos | AVIF, BMP, GIF, HEIC, ICO, JPG, PNG, TIFF, WEBP, ไฟล์ RAW บางประเภท | 200 MB |
| วิดีโอ | 3GP, 3G2, ASF, AVI, DIVX, M2T, M2TS, M4V, MKV, MMV, MOD, MOV, MP4, MPG, MTS, TOD, WMV | 20 GB |
ขั้นตอนที่ 1: อัปโหลดไบต์
อัปโหลดไบต์ไปยัง Google โดยใช้คำขออัปโหลด คำขออัปโหลดที่สำเร็จ
จะแสดงโทเค็นการอัปโหลดในรูปแบบของสตริงข้อความดิบ ใช้โทเค็นการอัปโหลดเหล่านี้เพื่อสร้างรายการสื่อด้วยbatchCreate
REST
ระบุฟิลด์ต่อไปนี้ในส่วนหัวของคำขอ POST
| ฟิลด์ส่วนหัว | |
|---|---|
Content-type |
ตั้งค่าเป็น application/octet-stream |
X-Goog-Upload-Content-Type |
แนะนำ ตั้งค่าเป็นประเภท MIME ของไบต์ที่คุณอัปโหลด
ประเภท MIME ที่พบบ่อย ได้แก่ image/jpeg,
image/png และ image/gif
|
X-Goog-Upload-Protocol |
ตั้งค่าเป็น raw |
ส่วนหัวคำขอ POST มีดังนี้
POST https://photoslibrary.googleapis.com/v1/uploads Authorization: Bearer oauth2-token Content-type: application/octet-stream X-Goog-Upload-Content-Type: mime-type X-Goog-Upload-Protocol: raw
ในเนื้อหาของคำขอ ให้ใส่ไบนารีของไฟล์ดังนี้
media-binary-data
หากคำขอ POST นี้สำเร็จ ระบบจะแสดงโทเค็นการอัปโหลดซึ่งอยู่ในรูปแบบ
ของสตริงข้อความดิบเป็นเนื้อหาการตอบกลับ หากต้องการสร้างรายการสื่อ
ให้ใช้สตริงข้อความต่อไปนี้ในbatchCreateการเรียก
upload-token
ขนาดไฟล์ที่แนะนำสำหรับรูปภาพคือไม่เกิน 50 MB ไฟล์ที่มีขนาดใหญ่กว่า 50 MB อาจทำให้เกิดปัญหาด้านประสิทธิภาพ
Google Photos Library API รองรับการอัปโหลดต่อ การอัปโหลดต่อได้ช่วยให้คุณ แบ่งไฟล์สื่อออกเป็นหลายส่วนและอัปโหลดทีละส่วนได้
ขั้นตอนที่ 2: สร้างรายการสื่อ
หลังจากอัปโหลดไบต์ของไฟล์สื่อแล้ว คุณจะสร้างไฟล์เหล่านั้นเป็นรายการสื่อใน Google Photos ได้โดยใช้โทเค็นการอัปโหลด โทเค็นการอัปโหลดมีอายุ 1 วันหลังจากสร้าง ระบบจะเพิ่มรายการสื่อลงในคลังของผู้ใช้เสมอ คุณเพิ่ม รายการสื่อได้เฉพาะในอัลบั้มที่แอปของคุณสร้างขึ้นเท่านั้น ดูข้อมูลเพิ่มเติมได้ที่ขอบเขต การให้สิทธิ์
หากต้องการสร้างรายการสื่อใหม่ ให้เรียกใช้
mediaItems.batchCreate
โดยระบุรายการของ newMediaItems แต่ละ newMediaItem จะมีโทเค็นการอัปโหลด
ที่ระบุไว้ภายใน simpleMediaItem และคำอธิบายที่ไม่บังคับ
ซึ่งจะแสดงต่อผู้ใช้
ช่องคำอธิบายจำกัดไว้ที่ 1,000 อักขระ และควรมีเฉพาะข้อความที่มีความหมายซึ่งผู้ใช้สร้างขึ้น เช่น "ทริปไปสวนสาธารณะ" หรือ "อาหารค่ำช่วงวันหยุด" อย่าใส่ข้อมูลเมตา เช่น ชื่อไฟล์ แท็กแบบเป็นโปรแกรม หรือข้อความอื่นๆ ที่สร้างขึ้นโดยอัตโนมัติ
หากต้องการให้ได้ประสิทธิภาพสูงสุด ให้ลดจำนวนการเรียกไปยัง mediaItems.batchCreate ที่คุณต้องทำโดยรวมรายการสื่อหลายรายการไว้ในการเรียกครั้งเดียว โปรดรอจนกว่าคำขอก่อนหน้าจะเสร็จสมบูรณ์ก่อนที่จะโทรครั้งถัดไปสำหรับผู้ใช้รายเดียวกัน
คุณสร้างรายการสื่อรายการเดียวหรือหลายรายการในคลังของผู้ใช้ได้ โดยระบุคำอธิบายและโทเค็นการอัปโหลดที่เกี่ยวข้อง ดังนี้
REST
ส่วนหัวคำขอ POST มีดังนี้
POST https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate Content-type: application/json Authorization: Bearer oauth2-token
เนื้อหาของคำขอควรระบุรายการ newMediaItems
{
"newMediaItems": [
{
"description": "item-description",
"simpleMediaItem": {
"fileName": "filename",
"uploadToken": "upload-token"
}
}
, ...
]
}นอกจากนี้ คุณยังระบุ albumId และ albumPosition เพื่อ
แทรกรายการสื่อในตำแหน่งที่ต้องการในอัลบั้มได้ด้วย
REST
{
"albumId": "album-id",
"newMediaItems": [
{
"description": "item-description",
"simpleMediaItem": {
"fileName": "filename",
"uploadToken": "upload-token"
}
}
, ...
],
"albumPosition": {
"position": "after-media-item",
"relativeMediaItemId": "media-item-id"
}
}ดูรายละเอียดเพิ่มเติมเกี่ยวกับการจัดตำแหน่งในอัลบั้มได้ที่เพิ่ม การตกแต่ง
การตอบกลับการสร้างรายการ
การเรียกใช้ mediaItems.batchCreate จะแสดงผลลัพธ์สำหรับรายการสื่อแต่ละรายการ
ที่คุณพยายามสร้าง รายการของ newMediaItemResults จะระบุสถานะและมี uploadToken สำหรับคำขอ รหัสสถานะที่ไม่ใช่ 0 แสดงว่ามี
ข้อผิดพลาด
REST
หากสร้างรายการสื่อทั้งหมดสำเร็จแล้ว คำขอจะแสดงสถานะ HTTP 200 OK หากสร้างรายการสื่อบางรายการไม่ได้
คำขอจะแสดงสถานะ HTTP 207 MULTI-STATUS เพื่อระบุ
ความสำเร็จบางส่วน
{
"newMediaItemResults": [
{
"uploadToken": "upload-token",
"status": {
"message": "Success"
},
"mediaItem": {
"id": "media-item-id",
"description": "item-description",
"productUrl": "https://photos.google.com/photo/photo-path",
"mimeType": "mime-type",
"mediaMetadata": {
"width": "media-width-in-px",
"height": "media-height-in-px",
"creationTime": "creation-time",
"photo": {}
},
"filename": "filename"
}
},
{
"uploadToken": "upload-token",
"status": {
"code": 13,
"message": "Internal error"
}
}
]
}หากเพิ่มรายการสำเร็จ ระบบจะแสดง mediaItem ที่มี
mediaItemId, productUrl และ mediaMetadata ดูข้อมูลเพิ่มเติมได้ที่เข้าถึงรายการสื่อ
หากรายการสื่อเป็นวิดีโอ คุณต้องประมวลผลวิดีโอก่อน mediaItem
มี status อยู่ภายใน mediaMetadata ซึ่งอธิบายสถานะการประมวลผล
ของไฟล์วิดีโอ ไฟล์ที่อัปโหลดใหม่จะแสดงสถานะเป็น PROCESSING
ก่อน จากนั้นจึงจะREADYพร้อมใช้งาน โปรดดูรายละเอียดที่หัวข้อเข้าถึงรายการสื่อ
หากพบข้อผิดพลาดระหว่างการเรียกนี้ ให้ทำตามแนวทางปฏิบัติแนะนำและลองส่งคำขออีกครั้ง คุณอาจต้องการติดตามการเพิ่มที่สำเร็จ เพื่อให้สามารถแทรกรูปภาพลงในอัลบั้มในตำแหน่งที่ถูกต้องระหว่างคำขอครั้งถัดไป ดูข้อมูลเพิ่มเติมได้ที่สร้าง อัลบั้ม
ระบบจะแสดงผลลัพธ์ตามลำดับเดียวกับที่ส่งโทเค็นการอัปโหลดเสมอ
แนวทางปฏิบัติแนะนำสำหรับการอัปโหลด
แนวทางปฏิบัติแนะนำและแหล่งข้อมูลต่อไปนี้จะช่วยปรับปรุงประสิทธิภาพโดยรวมในการอัปโหลด
- ทำตามแนวทางปฏิบัติแนะนำในการลองอีกครั้งและการจัดการข้อผิดพลาด โดยคำนึงถึงประเด็นต่อไปนี้
- ข้อผิดพลาด
429อาจเกิดขึ้นเมื่อโควต้าหมด หรือคุณถูกจำกัดอัตราเนื่องจากทำการเรียกมากเกินไปอย่างรวดเร็ว โปรดตรวจสอบว่าคุณจะไม่เรียกใช้batchCreateสำหรับผู้ใช้รายเดียวกันจนกว่าคำขอก่อนหน้าจะเสร็จสมบูรณ์ - ข้อผิดพลาด
429ต้องรออย่างน้อย30sก่อนลองอีกครั้ง ใช้กลยุทธ์ Exponential Backoff เมื่อลองส่งคำขออีกครั้ง - ข้อผิดพลาด
500จะเกิดขึ้นเมื่อเซิร์ฟเวอร์พบข้อผิดพลาด เมื่ออัปโหลด สาเหตุส่วนใหญ่เป็นเพราะการเรียกใช้การเขียนหลายครั้ง (เช่นbatchCreate) สำหรับผู้ใช้รายเดียวกันในเวลาเดียวกัน ตรวจสอบรายละเอียดของคำขอ และอย่าเรียกใช้batchCreateพร้อมกัน
- ข้อผิดพลาด
- ใช้ขั้นตอนการอัปโหลดต่อได้เพื่อ ทำให้การอัปโหลดมีความเสถียรมากขึ้นในกรณีที่เครือข่ายถูกขัดจังหวะ ซึ่งจะช่วยลด การใช้แบนด์วิดท์โดยให้คุณอัปโหลดต่อจากที่ค้างไว้ได้ ซึ่งมีความสำคัญเมื่ออัปโหลดจากอุปกรณ์เคลื่อนที่ของไคลเอ็นต์หรือเมื่ออัปโหลดไฟล์ขนาดใหญ่
นอกจากนี้ โปรดพิจารณาเคล็ดลับต่อไปนี้สำหรับแต่ละขั้นตอนของกระบวนการอัปโหลด การอัปโหลดไบต์และการสร้างรายการสื่อ
การอัปโหลดไบต์
- คุณสามารถอัปโหลดไบต์ (เพื่อเรียกโทเค็นการอัปโหลด) แบบขนานได้
- ตั้งค่าประเภท MIME ที่ถูกต้องในส่วน
X-Goog-Upload-Content-Typeหัวสำหรับ การเรียกอัปโหลดแต่ละครั้งเสมอ
การสร้างรายการสื่อ
อย่าโทรหา
batchCreateพร้อมกันสำหรับผู้ใช้รายเดียว- สำหรับผู้ใช้แต่ละราย ให้เรียกใช้
batchCreateทีละรายการ (แบบอนุกรม) - สำหรับผู้ใช้หลายราย ให้เรียกใช้
batchCreateสำหรับผู้ใช้แต่ละรายทีละคนเสมอ เรียกใช้สำหรับผู้ใช้ที่แตกต่างกันแบบขนานเท่านั้น
- สำหรับผู้ใช้แต่ละราย ให้เรียกใช้
ใส่
NewMediaItemsให้มากที่สุด ในการเรียกใช้แต่ละครั้งไปยังbatchCreateเพื่อลดจำนวนการเรียกใช้ทั้งหมดที่คุณต้องทำ คุณใส่รายการได้สูงสุด 50 รายการตั้งค่าข้อความอธิบายที่มีความหมาย ซึ่งผู้ใช้สร้างขึ้น อย่าใส่ข้อมูลเมตา เช่น ชื่อไฟล์ แท็กแบบเป็นโปรแกรม หรือข้อความอื่นๆ ที่สร้างขึ้นโดยอัตโนมัติในช่องคำอธิบาย
ตัวอย่างคำแนะนำแบบทีละขั้น
ตัวอย่างนี้ใช้รหัสเทียมเพื่อแสดงขั้นตอนการอัปโหลดรายการสื่อสำหรับผู้ใช้หลายราย เป้าหมายคือการอธิบายขั้นตอนทั้ง 2 ของกระบวนการอัปโหลด (การอัปโหลดไบต์ดิบและการสร้างรายการสื่อ) และ ให้รายละเอียดแนวทางปฏิบัติแนะนำสำหรับการสร้างการผสานรวมการอัปโหลดที่มีประสิทธิภาพและยืดหยุ่น
ขั้นตอนที่ 1: อัปโหลดไบต์ดิบ
ก่อนอื่น ให้สร้างคิวเพื่ออัปโหลดไบต์ดิบสำหรับรายการสื่อจากผู้ใช้ทั้งหมด
ติดตาม uploadToken ที่ส่งคืนแต่ละรายการต่อผู้ใช้ โปรดทราบประเด็นสำคัญต่อไปนี้
- จำนวนเธรดการอัปโหลดพร้อมกันจะขึ้นอยู่กับสภาพแวดล้อมการทำงาน
- พิจารณาจัดลำดับคิวการอัปโหลดใหม่ตามต้องการ เช่น คุณอาจ จัดลำดับความสำคัญของการอัปโหลดตามจำนวนการอัปโหลดที่เหลือต่อผู้ใช้ ความคืบหน้าโดยรวมของ ผู้ใช้ หรือข้อกำหนดอื่นๆ
ซูโดโค้ด
CREATE uploadQueue FROM users, filesToUpload
// Upload media bytes in parallel.
START multiple THREADS
WHILE uploadQueue is not empty
POP uploadQueue
UPLOAD file for user
GET uploadToken
CHECK and HANDLE errors
STORE uploadToken for user in uploadTokensQueue
ENDขั้นตอนที่ 2: สร้างรายการสื่อ
ในขั้นตอนที่ 1 คุณจะอัปโหลดไบต์หลายรายการจากผู้ใช้หลายคนแบบขนานได้ แต่ในขั้นตอนที่ 2 คุณจะโทรได้ครั้งละ 1 สายสำหรับผู้ใช้แต่ละคนเท่านั้น
ซูโดโค้ด
// For each user, create media items once 50 upload tokens have been
// saved, or no more uploads are left per user.
WHEN uploadTokensQueue for user is >= 50 OR no more pending uploads for user
// Calls can be made in parallel for different users,
// but only make a single call per user at a time.
START new thread for (this) user if there is no thread yet
POP 50 uploadTokens from uploadTokensQueue for user
CALL mediaItems.batchCreate with uploadTokens
WAIT UNTIL batchCreate call has completed
CHECK and HANDLE errors (retry as needed)
DONE.ทำกระบวนการนี้ต่อไปจนกว่าการอัปโหลดและการเรียกใช้การสร้างสื่อทั้งหมดจะเสร็จสมบูรณ์