【问题标题】:Streaming upload to Google Storage API when the final stream size is not known当最终流大小未知时,流式上传到 Google Storage API
【发布时间】:2020-02-29 20:17:19
【问题描述】:

因此,Google 存储有这个用于可恢复上传的强大 API:https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload,我想利用它来上传多个块中的大型对象。然而,这是在流处理管道中完成的,其中流中的字节总数是事先不知道的。

根据 API 的文档,您应该使用 Content-Range 标头告诉 Google Storage API 您已完成文件上传,例如:

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]

如果我理解这是如何正常工作的,那么 Content-Range 标头的 bytes 1023-2048/2048 值就是 Google 存储如何确定您正在上传最后一块数据,并且它可以在完成后成功完成可恢复的上传会话完毕。

但在我的情况下,总流大小事先不知道,所以我需要继续上传,直到没有更多数据要上传。有没有办法使用 Google Storage API 做到这一点?理想情况下,我希望通过某种方式手动告诉 API“嘿,我已经完成了,不要指望我提供更多数据”。

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage


    【解决方案1】:

    在我的情况下,总流大小事先不知道,

    在这种情况下,您需要在 PUT 请求中发送Content-Range: bytes 1023-2048/*。但请注意,这些请求必须是 256KiB 的倍数:

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

    所以我需要继续上传,直到没有更多数据要上传。有没有办法使用 Google Storage API 做到这一点?

    是的。你用bytes NNNNN-MMMMM/*发送块。

    理想情况下,我希望通过某种方式手动告诉 API“嘿,我已经完成了,不要指望我提供更多数据”。

    您可以通过 (a) 发送一个不是 256KiB 倍数的块,或 (b) 发送一个带有 bytes NNN-MMM/(MMM+1) 的块。即最后一个chunk包含上传的总大小,表示它包含最后一个字节。

    【讨论】:

    • 对于最后的“块”,为了关闭上传,我使用了零长度的 PUTContent-Range: bytes */TOTAL_SIZE。这似乎也“完成”了上传并创建了对象。
    【解决方案2】:

    您链接的文档指出:

    内容长度。 必需,除非您使用的是chunked transfer encoding。设置为此初始请求正文中的字节数。

    因此,如果您单击该链接到分块传输编码,HTTP 规范将解释如何在传输完成之前发送数据块:

    分块可以将未知大小的内容流作为 长度分隔的缓冲区序列,使发送者能够 保持连接持久性和接收者知道什么时候有 收到完整的消息。

    您自己实现此功能可能并不容易,因此我建议您找到一个知道如何为您执行此操作的 HTTP 客户端库。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多