Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 当最终流大小未知时,将流上载到Google Storage API_Google Cloud Platform_Google Cloud Storage - Fatal编程技术网

Google cloud platform 当最终流大小未知时,将流上载到Google Storage API

Google cloud platform 当最终流大小未知时,将流上载到Google Storage API,google-cloud-platform,google-cloud-storage,Google Cloud Platform,Google Cloud Storage,所以Google Storage有一个很好的API用于可恢复的上传:我想利用它来上传多个块中的大型对象。然而,这是在流内处理管道中完成的,其中流中的字节总量事先不知道 根据API的文档,您应该使用Content Range头告诉Google Storage API您已完成文件上传,例如: PUT https://www.googleapis.com/upload/storage/v1/b/myBucket/o?uploadType=resumable&upload_id=xa298sd_

所以Google Storage有一个很好的API用于可恢复的上传:我想利用它来上传多个块中的大型对象。然而,这是在流内处理管道中完成的,其中流中的字节总量事先不知道

根据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 Storage如何确定您正在上载最后一块数据,并在完成后成功完成可恢复的上载会话


然而,在我的例子中,总的流大小事先不知道,所以我需要继续上传,直到没有更多的数据要上传为止。有没有一种方法可以使用谷歌存储API实现这一点?理想情况下,我希望以某种方式手动告诉API“嘿,我完成了,不要期望我提供更多数据”。

您链接的文档说明:

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

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

Chunked使大小未知的内容流能够作为 长度分隔的缓冲区序列,使发送方能够 保留连接持久性,并让收件人知道它何时 收到了整个消息

单独实现这一点可能并不容易,因此我建议找到一个知道如何为您实现这一点的HTTP客户端库

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

在这种情况下,您需要在PUT请求中发送
内容范围:字节1023-2048/*
。但是请注意,这些请求必须是256KiB的倍数:

所以我需要继续上传,直到没有更多的数据可以上传。有没有一种方法可以使用谷歌存储API实现这一点

对。发送带有
字节NNNNN-MMMMM/*
的块

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

您可以通过(a)发送一个不是256KiB倍数的块,或者(b)发送一个包含
字节NNN-MMM/(MMM+1)
的块来实现这一点。也就是说,最后一个区块包含上载的总大小,并指示它包含最后一个字节。

对于最后一个“区块”,要关闭上载,我使用了一个长度为零的
PUT
内容范围:bytes*/total\u size
。这似乎也“完成”了上传并创建了对象。