Потоковая загрузка в Google Storage API, когда окончательный размер потока неизвестен - PullRequest
0 голосов
/ 04 ноября 2019

Таким образом, в Google Storage есть отличный API для возобновляемых загрузок: https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload, который я хотел бы использовать для загрузки большого объекта несколькими кусками. Однако это делается в конвейере обработки потока, где общее количество байтов в потоке заранее неизвестно.

Согласно документации API, вы должны использовать заголовок Content-Range, чтобы сообщитьAPI хранения Google, с которым вы закончили загрузку файла, например:

PUT https://www.googleapis.com/upload/storage/v1/b/myBucket/o?uploadType=resumable&upload_id=xa298sd_sdlkj2 HTTP/1.1
Content-Length: 1024
Content-Range: bytes 1023-2048/2048

[BYTES 1023-2048]

Если я правильно понимаю, как это работает правильно, то значение bytes 1023-2048/2048 заголовка Content-Range определяет способ хранения Google Storage. что вы загружаете последний кусок данных, и он может успешно завершить возобновляемый сеанс загрузки после того, как это будет сделано.

В моем случае общий размер потока заранее неизвестен, поэтому мне нужно продолжать загрузку до тех пор, пока не останется больше данных для загрузки . Есть ли способ сделать это с помощью Google Storage API? В идеале я хотел бы, чтобы какой-нибудь способ вручную сказать API «эй, я закончил, не ожидайте больше данных от меня».

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

В моем случае общий размер потока заранее неизвестен,

В этом случае вам необходимо отправить Content-Range: bytes 1023-2048/* в запросах PUT. Однако обратите внимание, что эти запросы должны быть кратны 256 КБ:

https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload#example_uploading_the_file

, поэтому мне нужно продолжать загрузку, пока не будет больше данных для загрузки. Есть ли способ сделать это с помощью Google Storage API?

Да. Вы отправляете куски с помощью bytes NNNNN-MMMMM/*.

В идеале я бы хотел как-то вручную сказать API: «Эй, я готов, не жди от меня больше данных».

Это можно сделать, либо (а) отправив чанк, не кратный 256 КБ, либо (б) отправив чанк с bytes NNN-MMM/(MMM+1). То есть последний блок содержит общий размер загрузки и указывает, что он содержит последний байт.

0 голосов
/ 04 ноября 2019

В документации, на которую вы ссылаетесь, указано, что:

Content-Length. Обязательно , если вы не используете chunked Transfer Encoding . Установите количество байтов в теле этого начального запроса.

Поэтому, если вы щелкнете по этой ссылке для кодирования фрагментированной передачи, в спецификации HTTP будет объяснено, как отправлять фрагменты данных до завершения передачи. :

Chunked позволяет передавать потоки контента неизвестного размера в виде последовательности буферов с разделителями длины, что позволяет отправителю сохранять постоянство соединения, а получателю знать, когда он получил все сообщение.

Вероятно, реализовать это самостоятельно будет непросто, поэтому я предлагаю найти клиентскую библиотеку HTTP, которая знает, как это сделать для вас.

...