适用于旧版捆绑服务的 Blobstore API 概览

借助 Blobstore API,您的应用可以提供称为 blob 的数据对象,这些数据对象的大小远远超过 Datastore 服务允许的上限。blob 对于提供大型文件(如视频或图片文件)非常有用,并且支持用户上传大型数据文件。blob 是通过 HTTP 请求上传文件而创建的。通常,您的应用会通过向用户显示包含文件上传字段的表单来完成此操作。在提交表单后,Blobstore 根据该文件的内容创建一个 blob,并返回对该 blob 的不透明引用,称为“blob 键”,您此后可使用该键提供 blob。应用可以响应用户请求提供完整的 blob 值,也可以使用类似流文件的接口直接读取该值。

Blobstore 简介

App Engine 包含 Blobstore 服务,借助此服务,应用提供的数据对象仅受可通过单个 HTTP 连接上传或下载的数据量限制。这些对象称为“Blobstore 值”或“Blob”。 Blobstore 值作为请求处理程序的响应提供,以通过 Web 表单上传内容的方式创建。应用不会直接创建 blob 数据,而是通过提交的网络表单或其他 HTTP POST 请求间接创建 blob。Blobstore 值可以使用 Blobstore API 提供给用户,也可以由应用在类文件流中访问。

为了提示用户上传 Blobstore 值,应用提供带有文件上传字段的 Web 表单。应用通过调用 Blobstore API 来生成表单的操作网址。用户的浏览器通过生成的网址将文件直接上传到 Blobstore。然后,Blobstore 会存储 blob,重写入请求以包含 blob 键,并将其传递给应用中的路径。位于应用中该路径的请求处理程序可以执行其他表单处理。

为了传送 blob,您的应用将为传出响应设置标头,并且 App Engine 会使用 blob 值替换该响应。

Blob 一旦创建便无法修改,但可以删除。每个 blob 都具有相应的 blob 信息记录(存储在数据存储区中),该记录提供有关 blob 的详细信息(例如,创建时间和内容类型)。您可以使用 blob 键提取 blob 信息记录以及查询其属性。

使用 Blobstore

应用可以使用 Blobstore 来接收用户上传的较大文件并提供这些文件。文件上传后,将称为 blob。应用不能直接通过文件名访问 blob,而是通过 Datastore 中的 blob 信息实体(由 类表示)处理 blob。

用户通过提交包含一个或多个文件输入字段的 HTML 表单来创建 blob。您的应用设置 为 此表单的目的地(操作),并将应用中处理程序的网址路径传递给该函数。当用户提交表单时,用户的浏览器直接将指定文件上传到 Blobstore。Blobstore 重新编写用户的请求并存储上传的文件数据(将上传的文件数据替换为一个或多个相应的 blob 键),然后将重新编写的请求传递给向 提供的网址路径处的处理程序。

该处理程序会根据 blob 键进行额外的处理。

应用可以使用

上传 Blob

如需创建和上传 Blob,请执行以下步骤:

1. 创建上传网址

调用 为用户将要填写的表单创建一个上传网址,并在表单的 POST 操作完成后传递要加载的应用路径。

upload_url = blobstore.create_upload_url("/upload_photo")

有一个异步版本 create_upload_url_async()。它允许您的应用代码在 Blobstore 生成上传网址时继续运行。

2. 创建上传表单

表单必须包含文件上传字段,并且必须将表单的 enctype 设置为 multipart/form-data。当用户提交表单时,POST 由创建 blob 的 Blobstore API 处理。该 API 还会为 blob 创建信息记录,并将该记录存储在 Datastore 中,然后将重写后的请求传递到应用的指定路径作为 blob 键。

您无法使用具有无服务器 NEG 的全球外部应用负载均衡器来处理发送到 blobstore.create_upload_url 调用返回的 /_ah/upload/ 网址的上传请求。您必须改为将这些上传请求直接路由到 App Engine 服务。您可以使用 appspot.com 网域或直接映射到 App Engine 服务的自定义网域来完成此操作。

3. 实现上传处理程序

在此处理程序中,您可以将 blob 键与应用数据模型的其他部分存储在一起。blob 键本身仍然可以通过 Datastore 中的 blob 信息实体进行访问。请注意,用户提交表单并调用处理程序后,即已保存 blob,并且 blob 信息已添加到 Datastore 中。如果应用不再需要 blob,您应立即删除 blob 以防止其成为孤立文件。

对于所有 Flask 应用,对 BlobstoreUploadHandler 类中的方法进行的所有调用都需要 request.environ dictionary(从 Flask 模块导入的请求)。如果您的应用是没有 Web 框架的 WSGI 应用,请在 get_uploads() 方法中使用 environ 参数。 在重写用户的请求时,Blobstore 会清空上传文件的 MIME 部分,并将 Blob 键添加为 MIME 部分标头。Blobstore 会保留所有其他表单字段和部分,并将它们传递给上传处理程序。 如果您没有指定内容类型,Blobstore 会尝试根据文件扩展名推断内容类型。如果无法确定内容类型,则会为新创建的 Blob 分配内容类型 application/octet-stream

传送 Blob

为了传送 Blob,您必须有一个 blob 下载处理程序并将其设为应用中的一个路径。 此处理程序应该将所需 blob 的 blob 键传递给 blobstore.Send