Tải lên có thể tiếp tụcResumable uploads

Trang này mô tả cách tạo một yêu cầu tải lên tiếp nối tới API Thư viện Google Photos qua giao thức REST. Giao thức này cho phép bạn tiếp tục hoạt động tải lên sau khi lỗi giao tiếp làm gián đoạn luồng dữ liệu.

Sử dụng tuỳ chọn tải lên tiếp nối trong trường hợp:

  • Bạn đang tải tệp có kích thước lớn lên.
  • Khả năng bị gián đoạn mạng hoặc một số lỗi truyền khác là rất cao (ví dụ: nếu bạn đang tải tệp lên từ một ứng dụng di động).

Tính năng tải lên tiếp nối cũng có thể giúp bạn giảm mức sử dụng băng thông khi có mạng vì bạn không phải bắt đầu lại quá trình tải tệp lớn lên từ đầu tiên.

Bước 1: Bắt đầu phiên tải lên

Khởi tạo một phiên tải lên có thể tiếp tục bằng cách gửi yêu cầu POST đến https://photoslibrary.googleapis.com/v1/uploads. Sử dụng quy trình tải lên tiếp nối URL được trả về trong yêu cầu này, hãy tải tệp lên.

Yêu cầu POST phải bao gồm các tiêu đề sau:

Trường tiêu đề
Content-Length Được đặt thành 0 vì nội dung yêu cầu trống.
X-Goog-Upload-Command Đặt thành start.
X-Goog-Upload-Content-Type Đặt thành loại mime của tệp, ví dụ: image/jpeg.
X-Goog-Upload-Protocol Đặt thành resumable.
X-Goog-Upload-Raw-Size Đặt thành tổng số byte của dữ liệu tệp cần đã chuyển.

Sau đây là tiêu đề yêu cầu 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

Bước 2: Lưu URL phiên

Nếu thành công, yêu cầu POST sẽ trả về mã trạng thái HTTP 200 OK, bao gồm tiêu đề sau đây.

X-Goog-Upload-URL: url-to-make-uploads-to
X-Goog-Upload-Chunk-Granularity: chunk-granularity-in-bytes

Trường tiêu đề x-goog-upload-chunk-granularity chứa cách căn chỉnh byte và độ chi tiết về kích thước của tất cả các phần dữ liệu do ứng dụng gửi. Nếu nội dung tải lên được thực hiện trong nhiều phần, tất cả các tệp tải lên, ngoại trừ tệp tải lên gần đây nhất, phải được thực hiện trong bội số của giá trị này. Tức là số byte tải lên của tệp phải được căn chỉnh theo giá trị này. Trong phần cuối cùng, bạn có thể tải các byte còn lại lên.

Trường tiêu đề X-Goog-Upload-URL chứa một URL duy nhất phải được sử dụng để hoàn tất quá trình tải lên thông qua tất cả các yêu cầu còn lại. Sao chép và lưu URL phiên có thể tiếp tục này để bạn có thể sử dụng cho các yêu cầu tiếp theo.

Bước 3: Tải tệp lên

Có hai cách để tải tệp có phiên hoạt động có thể tiếp tục lên:

  1. Trong một yêu cầu. Phương pháp này thường là tốt nhất vì yêu cầu ít yêu cầu hơn, do đó có hiệu suất tốt hơn.
  2. Trong nhiều phần. Trong phương pháp này, quá trình tải lên được thực hiện trong nhiều yêu cầu bằng cách chia dữ liệu thành các phần. Dữ liệu được chia theo phần bội số của x-goog-upload-chunk-granularity. Nếu cần, bạn có thể thử lại các yêu cầu được phân đoạn.

    Hãy sử dụng phương pháp này nếu:

    • Bạn cần giảm lượng dữ liệu được truyền trong bất kỳ yêu cầu riêng lẻ nào. Bạn có thể cần làm việc này khi có giới hạn thời gian cố định cho từng yêu cầu riêng lẻ.
    • Bạn cần cung cấp một chỉ báo tuỳ chỉnh cho thấy lượt tải lên tiến trình.
    • Bạn cần biết thời điểm an toàn để loại bỏ dữ liệu.

Yêu cầu đơn

Cách tải tệp lên trong một yêu cầu duy nhất:

  1. Tạo một yêu cầu POST đến URL của phiên hoạt động có thể tiếp tục.
  2. Thêm dữ liệu của tệp vào phần nội dung yêu cầu.
  3. Thêm các tiêu đề HTTP sau:

    • Content-Length: Đặt thành số byte trong tệp.
    • X-Goog-Upload-Command: Đặt thành upload, finalize.
  4. Gửi yêu cầu.

Nếu yêu cầu tải lên bị gián đoạn hoặc bạn nhận được 5xx hãy làm theo quy trình trong Tiếp tục quá trình tải lên bị gián đoạn.

Nếu yêu cầu thành công, bạn sẽ nhận được mã trạng thái HTTP 200 OK và mã thông báo tải lên trong phần nội dung phản hồi. Tạo mục nội dung đa phương tiện bằng mã thông báo tải lên này.

Nhiều đoạn

Cách tải tệp lên trong nhiều phần:

  1. Tạo yêu cầu POST đến URL phiên có thể tiếp tục.
  2. Thêm dữ liệu của đoạn vào phần nội dung yêu cầu.

    Ngoại trừ phần dữ liệu cuối cùng đã hoàn tất thao tác tải lên, hãy tạo các phần dữ liệu khác theo bội số của kích thước phần dữ liệu được chấp nhận. Giữ kích thước phân đoạn càng lớn càng tốt để quá trình tải lên diễn ra hiệu quả.

  3. Thêm các tiêu đề HTTP sau:

    • Content-Length: Đặt thành số byte trong phân đoạn.
    • X-Goog-Upload-Command: Đặt thành upload. Đối với phần cuối cùng, hãy đặt thành upload, finalize.
    • X-Goog-Upload-Offset: Đặt thành độ dời mà các byte sẽ được ghi. Xin lưu ý rằng bạn phải tải các byte lên theo tuần tự. Độ dời đầu tiên là 0.
  4. Gửi yêu cầu.

    Nếu yêu cầu tải lên bị gián đoạn hoặc bạn nhận được phản hồi 5xx, hãy làm theo quy trình trong phần Tiếp tục quá trình tải lên bị gián đoạn.

  5. Lặp lại các bước này cho từng đoạn còn lại trong tệp.

Nếu yêu cầu thành công, bạn sẽ nhận được trạng thái HTTP 200 OK và mã tải lên trong nội dung phản hồi. Tạo mục nội dung đa phương tiện bằng mã thông báo tải lên này.

Ví dụ:

Yêu cầu duy nhất

Ví dụ sau đây trình bày một yêu cầu tiếp tục được tải lên Tệp JPEG 3.039.417 byte trong một yêu cầu duy nhất.

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]

Phản hồi chứa URL tải lên và kích thước phân đoạn dự kiến:

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

Yêu cầu tải lên cuối cùng:

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]

Nhiều phần

Ví dụ sau đây cho thấy một yêu cầu có thể tiếp tục để tải một tệp JPEG có kích thước 3.039.417 byte lên theo nhiều phần, sử dụng URL phiên có thể tiếp tục và mức độ chi tiết về kích thước phần được chấp nhận thu được ở bước trước. Ví dụ này sử dụng kích thước phân đoạn là 262.144 byte được trả về trong trường tiêu đề, x-goog-upload-chunk-granularity, khi đã khởi tạo phiên tải lên. Xin lưu ý rằng mỗi lần tải lên chứa các byte là bội số của 262.144.

Khởi tạo phiên tải lên để nhận URL tải lên và kích thước đoạn như mô tả ở bước trước:

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]

Phản hồi chứa URL tải lên và kích thước khối dự kiến:

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

Phần đầu tiên:

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]

Phần thứ hai:

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]

Phần cuối cùng:

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]

Tiếp tục quá trình tải lên bị gián đoạn

Nếu yêu cầu tải lên bị gián đoạn hoặc nếu bạn nhận được mã trạng thái HTTP không phải 200, hãy truy vấn máy chủ để tìm hiểu lượng dữ liệu tải lên thành công.

Dưới đây là yêu cầu POST đến URL phiên có thể tiếp tục. Bạn nên đặt X-Goog-Upload-Command thành 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

Phản hồi từ máy chủ bao gồm mã trạng thái HTTP 200 OK và kích thước hiện tại của tệp tải lên.

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

Sau đó, bạn có thể tiếp tục tải lên ở mức chênh lệch này. Bạn phải tiếp tục tại độ dời do máy chủ cung cấp, trừ phi bạn gửi lệnh kết hợp tải lên và hoàn tất. Trong trường hợp này, bạn cũng có thể tiếp tục tại độ dời 0.

Nếu tiêu đề X-Goog-Upload-Status trong phản hồi HTTP của lệnh truy vấn có tồn tại và giá trị không phải là active, điều này cho biết rằng quá trình tải lên đã đã bị chấm dứt.