与 Google Cloud Platform 集成

Cloud Storage for Firebase 与 Google Cloud Platform 紧密集成。适用于 Cloud Storage 的 Firebase SDK 将文件直接存储在 Google Cloud Storage 存储分区中。随着您的应用扩容,您可以轻松集成其他 Cloud 服务,例如托管计算(如 App Engine 或 Cloud Functions)或者机器学习 API(如 Cloud Vision 或 Google 翻译)。

在后台,适用于 Cloud Storage 的 Firebase SDK 默认使用 Google App Engine 免费层级中的默认存储分区。这让您可以快速开始使用 Cloud Storage,而不必输入信用卡信息或启用某个结算帐号。借助 Cloud Storage,您还可以轻松在 Firebase 和 Google Cloud Platform 项目之间共享数据。

若要与 Google Cloud Platform 集成(包括导入现有的 Cloud Storage 存储分区),Firebase 项目必须采用 Blaze 方案。我们的定价页面上提供了关于这些方案的详细信息。

Google Cloud Storage

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

必须要注意的是,这些请求使用的是 Google Cloud Storage ACL项目级 IAM,而不是 Firebase 身份验证和 Storage 安全规则。

API

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

Google Cloud Server SDK

Google Cloud Platform 为多种 GCP 产品(包括 Cloud Storage)提供高品质的服务器 SDK。这些库有以下语言版本:Node.jsJavagoPythonPHPRuby。如需了解详细信息(包括安装说明、身份验证和问题排查),请参阅各平台相应的文档。

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 提供的 JSONXML 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 存储总是选取最新的版本,因此,如果您希望恢复某个对象,就需要使用上面的其他 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(JavaPythonGo)。与 Cloudinary 和 Imgix 类似,GAE Images API 可以调整图片的大小,旋转、翻转和剪裁图片,并返回图片托管网址以支持客户端转换。

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

gsutil -m acl ch -r -u firebase-storage@system.gserviceaccount.com:O gs://<your-cloud-storage-bucket>

已知问题

无法导入 GAE 应用的两种情况如下所示:

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

在上述两种情况下,项目都无法支持 Cloud Storage for Firebase,您应该创建一个新的 Firebase 项目以使用 Cloud Storage。请与支持部门联系以便我们可以帮助您解决问题。

Google Cloud Functions(测试版)

Google Cloud Functions 是一个基于事件的轻量级异步计算解决方案,可帮助您构建一些单一用途的小函数,这样无需管理服务器或运行时环境即可对云端事件作出响应。这些函数可用于对视频进行转码、使用机器学习对图像进行分类,或将元数据与 Firebase 实时数据库同步。与 Google App Engine 相比,Cloud Functions 开销更低,是对 Firebase 存储中的变化做出反应的最快捷方式。

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

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面