העלאות שניתן להמשיך

בדף הזה מוסבר איך ליצור בקשת העלאה שניתן להמשיך ל-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: העלאת הקובץ

יש שתי דרכים להעלות קובץ באמצעות סשן שניתן להמשיך:

  1. בבקשה אחת. בדרך כלל הגישה הזו היא הטובה ביותר, כי היא דורשת פחות בקשות, ולכן הביצועים שלה טובים יותר.
  2. במספר מקטעים. בגישה הזו, ההעלאות מתבצעות במספר בקשות על ידי חלוקת הנתונים למקטעים. הנתונים מחולקים למקטעים בכפולות של x-goog-upload-chunk-granularity. במקרה הצורך, אפשר לנסות שוב את הבקשות המחולקות.

    כדאי להשתמש בגישה הזו אם:

    • צריך להפחית את כמות הנתונים שמועברת בבקשה אחת. יכול להיות שתצטרכו לעשות זאת אם יש מגבלה זמן קבועה לבקשות ספציפיות.
    • עליך לספק אינדיקטור מותאם אישית שמראה את התקדמות ההעלאה.
    • חשוב לדעת מתי אפשר להשמיד נתונים בבטחה.

בקשה יחידה

כדי להעלות את הקובץ בבקשה אחת:

  1. יוצרים בקשה מסוג POST לכתובת ה-URL של הסשן שניתן להמשיך.
  2. מוסיפים את נתוני הקובץ לגוף הבקשה.
  3. מוסיפים את כותרות ה-HTTP הבאות:

    • Content-Length: מוגדר למספר הבייטים בקובץ.
    • X-Goog-Upload-Command: מוגדר ל-upload, finalize.
  4. שולחים את הבקשה.

אם בקשת ההעלאה הופסקה או אם מקבלים תשובה מסוג 5xx, אפשר להיעזר בהוראות שבקטע המשך של העלאה שהופסקה.

אם הבקשה תתבצע בהצלחה, תקבלו קוד סטטוס HTTP 200 OK ואסימון העלאה בגוף התשובה. יוצרים את פריט המדיה באמצעות אסימון ההעלאה הזה.

גושים מרובים

כדי להעלות את הקובץ במספר מקטעים:

  1. יוצרים בקשה מסוג POST לכתובת ה-URL של הסשן שניתן להמשיך.
  2. מוסיפים את נתוני הקטע לגוף הבקשה.

    חוץ מהקטע האחרון שמסתיים בהעלאה, צריך ליצור את שאר הקטעים ככפולות של גודל הקטעים המקובל. מומלץ להגדיר את גודל הקטעים כמה שיותר גדול כדי שההעלאה תהיה יעילה.

  3. מוסיפים את כותרות ה-HTTP הבאות:

    • Content-Length: מוגדר למספר הבייטים בקטע.
    • X-Goog-Upload-Command: מוגדר לערך upload. למקטע האחרון, מגדירים את הערך upload, finalize.
    • X-Goog-Upload-Offset: מוגדר לפער שבו צריך לכתוב את הבייטים. חשוב לזכור שצריך להעלות את הבייטים בסדר. ההיסט הראשון הוא 0.
  4. שולחים את הבקשה.

    אם בקשת ההעלאה הופסקה או אם מקבלים תשובה מסוג 5xx, אפשר להיעזר בהוראות שבקטע המשך של העלאה שהופסקה.

  5. חוזרים על השלבים האלה לכל מקטע שנותר בקובץ.

אם הבקשה תאושר, תקבלו קוד סטטוס 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]

מקטע שני:

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

התגובה מהשרת כוללת את קוד הסטטוס 200 OK של HTTP ואת הגודל הנוכחי של ההעלאה.

HTTP/1.1 200 OK
X-Goog-Upload-Status: active
X-Goog-Upload-Size-Received: 100

לאחר מכן תוכלו להמשיך בהעלאה מהמקום שבו הפסקתם. צריך להמשיך מההיסט שסופק על ידי השרת, אלא אם שולחים פקודה משולבת של העלאה וסיום, ובמקרה כזה אפשר להמשיך גם מההיסט 0.

אם הכותרת X-Goog-Upload-Status מופיעה בתגובת ה-HTTP של פקודת השאילתה והערך שלה הוא לא active, סימן שההעלאה כבר הסתיימה.