Firebase 使用 Google Cloud 服务账号来运行和管理服务,而无需共享用户凭据。在创建使用 Cloud Storage 的 Firebase 项目时,您可能会发现项目中已存在相应的服务账号:service-<project number>@gcp-sa-firebasestorage.iam.gserviceaccount.com
。如需了解详情,请参阅此 Firebase 支持指南。
在后台,支持 Cloud Storage 的 Firebase SDK 使用 App Engine 免费层级中的默认存储桶。这让您可以快速开始使用 Cloud Storage,而不必输入信用卡信息或启用某个 Cloud Billing 账号。您还可以轻松在 Firebase 和 Google Cloud 项目之间共享数据。
若要与 Google Cloud 集成(包括导入现有的 Cloud Storage 存储桶),Firebase 项目必须采用 Blaze 方案。我们的价格页面上提供了关于这些方案的详细信息。
Google Cloud Storage
您可以使用 Google Cloud Storage API 访问那些通过支持 Cloud Storage 的 Firebase SDK 上传的文件,尤其是执行较复杂的操作,例如复制或移动文件,或列出某个引用中的所有可用文件。
必须要注意的是,这些请求使用的是 Google Cloud Storage 访问权限控制选项,而不是 Firebase Authentication 和 Cloud Storage 安全规则。
API
根据您希望执行的操作,除了支持 Cloud Storage 的 Firebase SDK 之外,还有许多其他方法可用来访问存储在 Cloud Storage 存储桶中的数据。如果您要访问服务器上的数据,我们提供了服务器端库以及一个与 JSON
和 S3 兼容的 XML
RESTful API,或者如果您需要运行脚本以进行更改或执行其他管理任务,我们有一款命令行工具可以供您使用。
Google Cloud 服务器 SDK
Google Cloud 为多种 Cloud 产品(包括 Cloud Storage)提供高品质的服务器 SDK。这些库有以下语言版本:Node.js、Java、go、Python、PHP 和 Ruby。
如需了解详细信息(包括安装说明、身份验证和问题排查),请参阅上文链接的各平台相应的文档。
Google Cloud Storage SDK 的用法示例如下所示:
Node.js
// Require gcloud var gcloud = require('google-cloud'); // Enable Cloud Storage var gcs = gcloud.storage({ projectId: 'grape-spaceship-123', keyFilename: '/path/to/keyfile.json' }); // Reference an existing bucket. var bucket = gcs.bucket('my-existing-bucket'); // Upload a local file to a new file to be created in your bucket. bucket.upload('/photos/zoo/zebra.jpg', function(err, file) { if (!err) { // "zebra.jpg" is now in your bucket. } }); // Download a file from your bucket. bucket.file('giraffe.jpg').download({ destination: '/photos/zoo/giraffe.jpg' }, function(err) {});
Java
// Enable Cloud Storage Storage storage = StorageOptions.builder() .authCredentials(AuthCredentials.createForJson(new FileInputStream("/path/to/my/key.json")) .build() .service(); // Upload a local file to a new file to be created in your bucket. InputStream uploadContent = ... BlobId blobId = BlobId.of("my-existing-bucket", "zebra.jpg"); BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("text/plain").build(); Blob zebraBlob = storage.create(blobInfo, content); // Download a file from your bucket. Blob giraffeBlob = storage.get("my-existing-bucket", "giraffe.jpg", null); InputStream downloadContent = giraffeBlob.getInputStream();
Go
// Enable Cloud Storage client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json")) if err != nil { log.Fatal(err) } // Download a file from your bucket. rc, err := client.Bucket("my-existing-bucket").Object("giraffe.jpg").NewReader(ctx) if err != nil { log.Fatal(err) } defer rc.Close() body, err := ioutil.ReadAll(rc) if err != nil { log.Fatal(err) }
Python
# Import gcloud from google.cloud import storage # Enable Cloud Storage client = storage.Client() # Reference an existing bucket. bucket = client.get_bucket('my-existing-bucket') # Upload a local file to a new file to be created in your bucket. zebraBlob = bucket.get_blob('zebra.jpg') zebraBlob.upload_from_filename(filename='/photos/zoo/zebra.jpg') # Download a file from your bucket. giraffeBlob = bucket.get_blob('giraffe.jpg') giraffeBlob.download_as_string()
PHP
// Require gcloud require 'vendor/autoload.php'; use Google\Cloud\Storage\StorageClient; // Enable Cloud Storage $storage = new StorageClient([ 'projectId' => 'grape-spaceship-123' ]); // Reference an existing bucket. $bucket = $storage->bucket('my-existing-bucket'); // Upload a file to the bucket. $bucket->upload( fopen('/photos/zoo/zebra.jpg', 'r') ); // Download a file from your bucket. $object = $bucket->object('giraffe.jpg'); $object->downloadToFile('/photos/zoo/giraffe.jpg');
Ruby
# Require gcloud require "google/cloud" # Enable Cloud Storage gcloud = Google::Cloud.new "grape-spaceship-123", "/path/to/keyfile.json" storage = gcloud.storage # Reference an existing bucket. bucket = storage.bucket "my-existing-bucket" # Upload a file to the bucket. bucket.create_file "/photos/zoo/zebra.jpg", "zebra.jpg" # Download a file from your bucket. file = bucket.file "giraffe.jpg" file.download "/photos/zoo/#{file.name}"
REST API
如果您使用的编程语言没有客户端库,或者您想要执行客户端库不支持的某些操作,又或者您偏好使用某个 HTTP 客户端,则可以使用 Google Cloud Storage 提供的 JSON 和 XML API。
除了这些存储数据访问 API 之外,您还可以使用 Cloud Storage for Firebase API 来管理用于 Firebase 项目的 Cloud Storage 存储桶。
gsutil
gsutil
是一款命令行工具,您可以使用该工具直接访问 Cloud Storage。您可以使用 gsutil
完成各种各样的存储桶和对象管理任务,包括:
- 上传、下载和删除对象。
- 列出存储分区和对象。
- 移动、复制和重命名对象。
- 编辑对象和存储分区 ACL。
使用 gsutil
还可以完成其他高级操作,比如将文件从一个目录移到另一个目录,或删除特定位置下的所有文件。
将所有文件从一个引用移到另一个引用非常容易,如下所示:
gsutil mv gs://bucket/old/reference gs://bucket/new/reference
批量删除某个引用下的所有文件同样很直观,如下所示:
# Delete all files under a path gsutil rm -r gs://bucket/reference/to/delete# Delete all the files in a bucket but not the bucket gsutil rm -r gs://bucket/**
# Delete all the files AND the bucket # Removing the default bucket will break the Firebase SDKs for Cloud Storage and is strongly discouraged gsutil rm -r gs://bucket
请求速率
Google Cloud Storage 是一项可扩缩性极强的服务,利用自动扩缩技术来实现极高的请求速率。
Google Cloud Storage 是一项多租户服务,这意味着用户可以共享同一组底层资源。为了充分利用这些共享资源,存储桶的初始 IO 容量如下:
当您计划将 Cloud Storage for Firebase 集成到您的应用中时,请考虑应用为实现良好性能而需要的最低请求速率,以及如何高效地发出请求。查看关于请求速率的准则,尤其是提高请求速率。
对象版本控制
您是否曾不小心删除了某些内容而没有备份?
Google Cloud Storage 支持对象版本控制,该功能提供了一种自动备份您的数据并从这些备份中恢复数据的方法。您可以使用 gsutil
versioning set
命令启用对象版本控制:
gsutil versioning set on gs://<your-cloud-storage-bucket>
Cloud Storage 总是选取最新的版本,因此,如果您希望恢复某个对象,就需要使用上面的其他 API 或工具之一将所需对象设置为最新的版本。
对象生命周期管理
对于许多应用来说,自动归档或删除过时文件的功能是非常有用的。幸运的是,Google Cloud Storage 提供了对象生命周期管理功能,使用该功能可以删除或归档超过了一定时间的对象。
假设有这样一个照片共享应用,您希望所有照片在一天后都被删除。您可以设置一个对象生命周期政策,如下所示:
// lifecycle.json { "lifecycle": { "rule": [ { "action": {"type": "Delete"}, "condition": {"age": 1} } ] } }
然后使用 gsutil
lifecycle set
命令部署该政策:
gsutil lifecycle set lifecycle.json gs://<your-cloud-storage-bucket>
请注意,这适用于存储桶中的所有文件,因此,如果您既要存储自己希望长时间存储的重要用户备份,同时又要存储您希望每天删除的照片,那么应使用两个单独的存储桶,或者使用 gsutil
或您自己的服务器手动执行删除操作。
App Engine
App Engine 是一种“平台即服务”产品,它会根据收到的流量多少自动扩缩后端逻辑的计算规模。只需上传您的后端代码,Google 就会管理您的应用的可用性;您不需要预配或维护服务器。使用 App Engine,您可以快速、轻松地为自己的 Firebase 应用增加额外的处理能力或可信执行环境。
适用于 Cloud Storage 的 Firebase SDK 使用 App Engine 默认存储桶,意味着如果您构建一个 App Engine 应用,就可以使用内置的 App Engine API 在 Firebase 与 App Engine 之间共享数据。这对于执行音频编码、视频转码、图像变换以及其他计算密集型后台处理很有用。
适用于 App Engine 的 Java、Python 和 Go 标准环境包括 App Engine Images API(Java、Python)。与 Cloudinary 和 Imgix 类似,App Engine Images API 可以调整图片的大小,旋转、翻转和剪裁图片,并返回图片传送网址以支持客户端转换。
在将某个现有的 Google Cloud 项目导入 Firebase 中时,如果您希望在 Firebase 中能够使用任何现有的 App Engine 对象,则需要通过使用 gsutil
运行以下命令为您的对象设置默认访问控制条件,以允许 Firebase 访问它们:
gsutil -m acl ch -r -u service-<project number;gt@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://<your-cloud-storage-bucket>
已知问题
已知无法导入 App Engine 应用的两种情况如下所示:
- 项目包含旧版 App Engine Datastore Master/Slave 应用。
- 项目 ID 包含网域前缀,例如:
domain.com:project-1234
。
在上述两种情况下,项目都无法支持 Cloud Storage for Firebase,您应该创建一个新的 Firebase 项目以使用 Cloud Storage。请与支持团队联系,以便我们为您提供帮助。
Google Cloud Functions(Beta 版)
Google Cloud Functions 是一个基于事件的轻量级异步计算解决方案,可帮助您构建一些小规模、单一用途的函数,让您无需管理服务器或运行时环境即可对事件作出响应。这些函数可用于对视频进行转码、使用机器学习技术对图像进行分类,或将元数据与 Firebase Realtime Database 同步。与 App Engine 相比,Cloud Functions 开销更低,是对 Cloud Storage 中的变化做出反应的最快捷的方式。
Google Cloud Vision API
借助 Google Cloud Vision API,开发者能够在一个易于使用的 API 中封装强大的机器学习模型来了解图像的内容。Google Cloud Vision API 可快速地将图像分为数千个类别,检测图像内的单个对象和面孔,找到并读取图像内包含的文字,识别令人反感的内容,甚至进行图像情感分析。
Google Cloud Speech API
与 Vision API 类似,借助 Google Cloud Speech API,开发者可以从存储在 Cloud Storage 中的音频文件中提取文本。 该 API 可以识别超过 80 种语言和语言变体,以支持您的全球用户群。将 Google Cloud Speech API 与 Google Cloud Natural Language API 结合使用时,开发人员不仅可以提取原始文本,而且可以推断文本的含义。如果为全球用户服务,可结合使用 Google Translate API 以将文本翻译成 90 多种语言。