На этой странице описано, как отправить запрос на возобновляемую загрузку в API библиотеки Google Фото через протокол 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: Загрузка файла
Есть два способа загрузить файл с возобновляемой сессией:
- В одном запросе. Этот подход обычно является лучшим, поскольку требует меньшего количества запросов и, следовательно, обеспечивает более высокую производительность.
В нескольких кусках. При таком подходе загрузка осуществляется несколькими запросами путем фрагментирования данных. Данные разбиты на фрагменты, кратные
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]
Второй кусок:
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
, это означает, что загрузка уже прекращена.