与 Google Cloud 集成

Cloud Storage for FirebaseGoogle Cloud 紧密集成。支持 Cloud StorageFirebase SDK 将文件直接存储在 Google Cloud Storage 存储桶中。随着您的应用扩容,您可以集成其他 Google Cloud 服务,例如托管式计算(如 App Engine 或 Cloud Functions)或者机器学习 API(如 Cloud Vision 或 Google 翻译)。

Firebase 项目实际上只是一个启用了额外的 Firebase 特定配置和服务的 Google Cloud 项目。这意味着,您在 Google Cloud 中可以访问与 Cloud Storage for Firebase 搭配使用的每个 Cloud Storage 存储桶(包括其控制台和 API)。

若要与 Google Cloud 集成(包括导入现有的 Cloud Storage 存储桶),Firebase 项目必须采用随用随付 Blaze 定价方案

服务账号注意事项

Google Cloud 使用服务账号来运行和管理服务,而无需共享用户凭据。在创建使用 Cloud Storage 的 Firebase 项目时,您可能会发现项目中已存在相应的服务账号:service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com。 如需了解详情,请参阅 Firebase 服务账号概览

Google Cloud Storage

您可以使用 Google Cloud Storage API 访问那些通过支持 Cloud StorageFirebase SDK 上传的文件,尤其是执行较复杂的操作,例如复制或移动文件,或列出某个引用中的所有可用文件。

必须要注意的是,这些请求使用的是 Google Cloud Storage 访问权限控制选项,而不是 Firebase AuthenticationCloud Storage Security Rules 安全规则。

API

根据您希望执行的操作,除了支持 Cloud StorageFirebase SDK 之外,还有许多其他方法可用来访问存储在 Cloud Storage 存储桶中的数据。如果您要访问服务器上的数据,我们提供了服务器端库以及一个与 JSON 和 S3 兼容的 XML RESTful API,或者如果您需要运行脚本以进行更改或执行其他管理任务,我们有一款命令行工具可以供您使用。

Google Cloud 服务器 SDK

Google Cloud 为多种 Cloud 产品(包括 Cloud Storage)提供高品质的服务器 SDK。这些库有以下语言版本:Node.jsJavagoPythonPHPRuby

如需了解详细信息(包括安装说明、身份验证和问题排查),请参阅上文链接的各平台相应的文档。

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 提供的 JSONXML 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 或您自己的服务器手动执行删除操作。

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 多种语言。

Google App Engine

Google App Engine 是一种“平台即服务”产品,它会根据收到的流量多少自动扩缩后端逻辑的计算规模。只需上传您的后端代码,Google 就会管理您的应用的可用性;您不需要预配或维护服务器。App Engine 是为您的 Firebase 应用增加额外的处理能力或可信执行的一种快速、简单的方式。

如果您的默认 Cloud Storage 存储桶采用 PROJECT_ID.appspot.com 的名称格式,则会自动与项目中的 App Engine 应用共享。这意味着,如果您构建一个 App Engine 应用,就可以使用内置的 App Engine API 在该存储桶与 App Engine 之间共享数据。这对于执行音频编码、视频转码、图像变换以及其他计算密集型后台处理很有用。

适用于 App Engine 的 Java、Python 和 Go 标准环境包括 App Engine Images API(Java | Python | Go)。与 Cloudinary 和 Imgix 类似,App Engine Images API 可以调整图片的大小,旋转、翻转和剪裁图片,并返回图片传送网址以支持客户端转换。

在将某个现有的 Google Cloud 项目导入 Firebase 中时,如果您希望在 Firebase 中能够使用任何现有的 App Engine 对象,则需要通过使用 gsutil 运行以下命令为您的对象设置默认访问控制条件,以允许 Firebase 访问它们:

gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://BUCKET_NAME

Firebase Security RulesApp Engine 文件注意事项

如果您的默认 Cloud Storage 存储桶的名称格式为 *.appspot.com,那么您的项目还具有共享该存储桶的 App Engine 应用。

如果您将 Firebase Security Rules 配置为公开(未经身份验证)访问,则新上传的 App Engine 文件也将可供公开访问。

Cloud StorageApp Engine 的已知问题

已知无法导入 App Engine 应用的两种情况如下所示:

  1. 项目包含旧版 App Engine Datastore Master/Slave 应用。
  2. 项目 ID 包含网域前缀,例如:domain.com:project-1234

在上述两种情况下,项目都无法支持 Cloud Storage for Firebase,您应该创建一个新的 Firebase 项目以使用 Cloud Storage。请与支持团队联系,以便我们为您提供帮助。