Firebase 使用 Google Cloud 服务帐号来运行和管理服务,而无需共享用户凭据。使用 Google Cloud Storage 创建 Firebase 项目时,您可能会发现您的项目中已存在相应的服务帐号可供使用:service-<project number>@gcp-sa-firebasestorage.iam.gserviceaccount.com.
请参阅此 Firebase 支持指南了解详情。
在后台,适用于 Cloud Storage 的 Firebase SDK 默认使用 Google App Engine 免费层级中的默认存储分区。这样您可以快速开始使用 Google Cloud Storage,而不必输入信用卡信息或启用某个结算帐号。您还可以轻松在 Firebase 和 Google Cloud 项目之间共享数据。
若要与 Google Cloud 集成(包括导入现有的 Cloud Storage 存储分区),Firebase 项目必须采用 Blaze 方案。我们的价格页面上提供了关于这些方案的详细信息。
Google Cloud Storage
您可以使用 Google Cloud Storage API 访问那些通过适用于 Cloud Storage 的 Firebase SDK 上传的文件,尤其是执行较复杂的操作,例如复制或移动文件,或列出某个引用中的所有可用文件。
必须要注意的是,这些请求使用的是 Google Cloud Storage 访问权限控制选项,而不是 Firebase 身份验证和 Storage 安全规则。
API
根据您希望执行的操作,除了适用于 Cloud Storage 的 Firebase SDK 之外,还有许多其他方法可用来访问存储在 Google Cloud Storage 存储分区中的数据。如果您要访问服务器上的数据,可使用我们提供的服务器端库以及一个与 JSON
和 S3 兼容的 XML
RESTful API;如果您需要运行脚本以进行更改或执行其他管理任务,可使用我们提供的一款命令行工具。
Google Cloud Server SDK
Google Cloud 为多种 Cloud 产品(包括 Cloud Storage)提供高品质的服务器 SDK。这些库有以下语言版本:Node.js、Java、go、Python、PHP 和 Ruby。如需了解详细信息(包括安装说明、身份验证和问题排查),请参阅各平台相应的文档。
Google Cloud SDK 的用法示例如下所示:
Node.js
// Require gcloud var gcloud = require('google-cloud'); // Enable 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 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 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 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 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 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 客户端,则可以使用 Cloud Storage 提供的 JSON 和 XML API。
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
对象版本控制
您是否曾不小心删除了某些东西而没有备份?Cloud Storage 对象版本控制功能提供了一种自动备份您的数据并从这些备份中恢复数据的方法。
您可以使用 gsutil
versioning set
命令启用对象版本控制:
gsutil versioning set on gs://<your-cloud-storage-bucket>
Firebase Storage 总是选取最新的版本,因此,如果您希望恢复某个对象,就需要使用上面的其他 API 或工具之一将所需对象设置为最新的版本。
对象生命周期管理
对于许多应用来说,具有自动归档或删除过时文件的能力是非常有用的。幸运的是,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
或您自己的服务器手动执行删除。
Google App Engine
Google App Engine 是一种“平台即服务”产品,它会根据收到的流量多少自动调节后端逻辑的计算规模。只需上传您的后端代码,Google 就会管理您的应用的可用性;您不需要预配或维护服务器。通过 App Engine,您可以快速、轻松地为您的 Firebase 应用增加额外的处理能力或可信执行环境。
适用于 Cloud Storage 的 Firebase SDK 使用 Google App Engine 默认存储分区,这意味着,如果您要构建一个 App Engine 应用,那么可以使用内置的 App Engine API 在 Firebase 与 App Engine 之间共享数据。这对于执行音频编码、视频转码、图片变换以及其他计算密集型后台处理很有用。
适用于 Google App Engine 的 Java、Python 和 Go 标准环境包括 GAE Images API(Java、Python)。与 Cloudinary 和 Imgix 类似,GAE 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>
已知问题
已知无法导入 GAE 应用的两种情况如下所示:
- 项目包含旧版 App Engine Datastore Master/Slave 应用。
- 项目 ID 包含网域前缀,例如:
domain.com:project-1234
。
在上述两种情况下,项目都无法支持 Google Cloud Storage for Firebase,您应该创建一个新的 Firebase 项目以使用 Google Cloud Storage。请与支持部门联系以便我们可以帮助您解决问题。
Google Cloud Functions(测试版)
Google Cloud Functions 是一个基于事件的轻量级异步计算解决方案,可帮助您构建一些单一用途的小函数,这样无需管理服务器或运行时环境即可对云端事件作出响应。这些函数可用于对视频进行转码、使用机器学习技术对图像进行分类,或将元数据与 Firebase Realtime Database 同步。与 Google App Engine 相比,Cloud Functions 开销更低,是对 Firebase 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 多种语言。