Cloud Storage 支持将数据流式传输到存储桶,而无需先将数据保存到文件中。如果您想要上传数据,但是在上传开始时不知道数据的最终大小(例如从进程生成上传数据或者即时压缩对象时),则此功能很有用。
流式传输时使用校验和验证
由于只能在上传的初始请求中提供校验和,因此在流式传输时利用 Cloud Storage 的校验和验证通常不可行。建议您始终使用校验和验证,并且可以在流式上传完成后手动执行此操作:但是,在传输完成后进行验证意味着在确认损坏并移除数据期间可以访问任何损坏的数据。
如果您需要在上传完成且数据可以访问之前进行校验和验证,则不应使用流式上传。您应该改用在对象完成之前执行校验和验证的上传选项。
所需的角色
如需获得流式上传所需的权限,请让您的管理员为您授予以下角色之一:
对于包含对象保留锁定的上传,请让您的管理员为您授予存储桶的 Storage Object Admin (
roles/storage.objectAdmin
) IAM 角色。对于其他所有情况,请让您的管理员为您授予存储桶的 Storage Object User (
roles/storage.objectUser
) IAM 角色。
这些预定义角色包含流式上传到 Cloud Storage 所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
storage.objects.create
storage.objects.delete
- 只有覆盖现有对象的上传操作需要此权限。
storage.objects.list
- 只有在使用 Google Cloud CLI 执行本页面上的说明时,才需要此权限。
storage.objects.setRetention
- 只有包含对象保留锁定的上传操作才需要此权限。
如需了解如何授予存储桶的角色,请参阅将 IAM 与存储桶搭配使用。
流式上传
以下示例展示了如何执行从进程到 Cloud Storage 对象的流式上传:
控制台
Google Cloud 控制台不支持流式上传。请改用 gcloud CLI。
命令行
将数据传输到
gcloud storage cp
命令并使用短划线表示源网址:PROCESS_NAME | gcloud storage cp - gs://BUCKET_NAME/OBJECT_NAME
其中:
PROCESS_NAME
是您要从中收集数据的进程的名称。例如collect_measurements
。BUCKET_NAME
是包含对象的存储桶的名称。例如my_app_bucket
。OBJECT_NAME
是使用数据创建的对象的名称。例如data_measurements
。
客户端库
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
REST API
JSON API
如需执行流式上传,请使用以下方法之一:
可续传上传,但进行以下调整:
上传文件数据本身时,请使用多个数据块上传。
由于您在上传最终数据块之前不知道文件的总大小,因此请在中间数据块的
Content-Range
标头中使用*
来表示文件的总大小。例如,如果您上传的第一个数据块的大小为 512 KiB,则该数据块的
Content-Range
标头为bytes 0-524287/*
。如果上传第一个数据块后剩余 64000 字节,则您随后会发送一个包含剩余字节并且Content-Range
标头值为bytes 524288-588287/588288
的最终数据块。
单一请求上传,但进行以下调整:
根据规范构建请求,并在对象数据可用时分块发送对象数据。
XML API
如需执行流式上传,请使用以下方法之一:
可续传上传,但进行以下调整:
上传文件数据本身时,请使用多个数据块上传。
由于您在上传最终数据块之前不知道文件的总大小,因此请在中间数据块的
Content-Range
标头中使用*
来表示文件的总大小。例如,如果您上传的第一个数据块的大小为 512 KiB,则该数据块的
Content-Range
标头为bytes 0-524287/*
。如果上传第一个数据块后剩余 64000 字节,则您随后会发送一个包含剩余字节并且Content-Range
标头值为bytes 524288-588287/588288
的最终数据块。
单一请求上传,但进行以下调整: