170

使用 Firebase 功能在 Firebase 存储中上传文件后,我想获取文件的下载 url。

我有这个 :

...

return bucket
    .upload(fromFilePath, {destination: toFilePath})
    .then((err, file) => {

        // Get the download url of file

    });

目标文件有很多参数。甚至一个名为mediaLink. 但是,如果我尝试访问此链接,则会收到此错误:

匿名用户没有 storage.objects.get 访问对象...

有人可以告诉我如何获取公共下载网址吗?

谢谢

4

24 回答 24

171

您需要通过@google-cloud/storage NPM 模块使用getSignedURL生成签名 URL。

例子:

const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
// ...
const bucket = gcs.bucket(bucket);
const file = bucket.file(fileName);
return file.getSignedUrl({
  action: 'read',
  expires: '03-09-2491'
}).then(signedUrls => {
  // signedUrls[0] contains the file's public URL
});

您需要@google-cloud/storage使用您的服务帐户凭据进行初始化,因为应用程序默认凭据是不够的。

更新:现在可以通过 Firebase Admin SDK 访问 Cloud Storage SDK,它充当@google-cloud/storage 的包装器。唯一的方法是,如果您:

  1. 使用特殊服务帐户初始化 SDK,通常通过第二个非默认实例。
  2. 或者,在没有服务帐户的情况下,通过授予默认 App Engine 服务帐户“signBlob”权限。
于 2017-03-22T17:53:53.577 回答
119

此答案将总结在将文件上传到 Google/Firebase Cloud Storage 时获取下载 URL 的选项。下载 URL 分为三种类型:

  1. 签名的下载 URL,它们是临时的并且具有安全功能
  2. 令牌下载 URL,它们是持久的并具有安全功能
  3. 公共下载 URL,持久且缺乏安全性

获取令牌下载 URL 的方法有 3 种。其他两个下载 URL 只有一种获取方式。

从 Firebase 存储控制台

您可以从 Firebase Storage 控制台获取下载 URL:

在此处输入图像描述

下载 URL 如下所示:

https://firebasestorage.googleapis.com/v0/b/languagetwo-cd94d.appspot.com/o/Audio%2FEnglish%2FUnited_States-OED-0%2Fabout.mp3?alt=media&token=489c48b3-23fb-4270-bd85-0a328d2808e5

第一部分是文件的标准路径。最后是令牌。此下载 URL 是永久的,即不会过期,但您可以撤销它。

getDownloadURL() 从前端

文档告诉我们使用getDownloadURL()

let url = await firebase.storage().ref('Audio/English/United_States-OED-' + i +'/' + $scope.word.word + ".mp3").getDownloadURL();

这将获得与您可以从 Firebase 存储控制台获得的下载 URL 相同的下载 URL。这种方法很简单,但要求您知道文件的路径,在我的应用程序中,该路径大约有 300 行代码,用于相对简单的数据库结构。如果您的数据库很复杂,这将是一场噩梦。您可以从前端上传文件,但这会将您的凭据暴露给任何下载您的应用程序的人。因此,对于大多数项目,您需要从 Node 后端或 Google Cloud Functions 上传文件,然后获取下载 URL 并将其与有关文件的其他数据一起保存到您的数据库中。

getSignedUrl() 用于临时下载 URL

getSignedUrl()易于从 Node 后端或 Google Cloud Functions 使用:

  function oedPromise() {
    return new Promise(function(resolve, reject) {
      http.get(oedAudioURL, function(response) {
        response.pipe(file.createWriteStream(options))
        .on('error', function(error) {
          console.error(error);
          reject(error);
        })
        .on('finish', function() {
          file.getSignedUrl(config, function(err, url) {
            if (err) {
              console.error(err);
              return;
            } else {
              resolve(url);
            }
          });
        });
      });
    });
  }

签名的下载 URL 如下所示:

https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio%2FSpanish%2FLatin_America-Sofia-Female-IBM%2Faqu%C3%AD.mp3?GoogleAccessId=languagetwo-cd94d%40appspot.gserviceaccount.com&Expires=4711305600&Signature=WUmABCZIlUp6eg7dKaBFycuO%2Baz5vOGTl29Je%2BNpselq8JSl7%2BIGG1LnCl0AlrHpxVZLxhk0iiqIejj4Qa6pSMx%2FhuBfZLT2Z%2FQhIzEAoyiZFn8xy%2FrhtymjDcpbDKGZYjmWNONFezMgYekNYHi05EPMoHtiUDsP47xHm3XwW9BcbuW6DaWh2UKrCxERy6cJTJ01H9NK1wCUZSMT0%2BUeNpwTvbRwc4aIqSD3UbXSMQlFMxxWbPvf%2B8Q0nEcaAB1qMKwNhw1ofAxSSaJvUdXeLFNVxsjm2V9HX4Y7OIuWwAxtGedLhgSleOP4ErByvGQCZsoO4nljjF97veil62ilaQ%3D%3D

签名的 URL 具有到期日期和长签名。命令行gsutil signurl -d的文档说签名的 URL 是临时的:默认过期时间为一小时,最长过期时间为 7 天。

我要在这里咆哮,getSignedUrl从来没有说过你的签名 URL 将在一周内过期。文档代码中有3-17-2025过期日期,提示可以设置未来的过期年份。我的应用程序运行良好,一周后就崩溃了。错误消息说签名不匹配,而不是下载 URL 已过期。我对我的代码进行了各种更改,一切正常……直到一周后一切都崩溃了。这种沮丧持续了一个多月。

使您的文件公开可用

您可以将文件的权限设置为公开阅读,如文档中所述。这可以通过云存储浏览器或您的节点服务器完成。您可以公开一个文件或一个目录或整个存储数据库。这是节点代码:

var webmPromise = new Promise(function(resolve, reject) {
      var options = {
        destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
        predefinedAcl: 'publicRead',
        contentType: 'audio/' + audioType,
      };

      synthesizeParams.accept = 'audio/webm';
      var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
      textToSpeech.synthesize(synthesizeParams)
      .then(function(audio) {
        audio.pipe(file.createWriteStream(options));
      })
      .then(function() {
        console.log("webm audio file written.");
        resolve();
      })
      .catch(error => console.error(error));
    });

在您的 Cloud Storage 浏览器中,结果将如下所示:

在此处输入图像描述

然后任何人都可以使用标准路径下载您的文件:

https://storage.googleapis.com/languagetwo-cd94d.appspot.com/Audio/English/United_States-OED-0/system.mp3

另一种公开文件的方法是使用方法makePublic()。我无法让它工作,正确获取存储桶和文件路径很棘手。

一个有趣的替代方法是使用访问控制列表。您可以使文件仅对您列入列表的用户可用,或用于authenticatedRead使从 Google 帐户登录的任何人都可以使用该文件。如果有一个选项“任何使用 Firebase Auth 登录我的应用程序的人”我会使用它,因为它会限制只有我的用户可以访问。

使用 firebaseStorageDownloadTokens 构建您自己的下载 URL

几个答案描述了一个未记录的 Google Storage 对象属性firebaseStorageDownloadTokens。有了这个,您可以告诉 Storage 您要使用的令牌。uuid您可以使用Node 模块生成令牌。四行代码,您可以构建自己的下载 URL,与您从控制台或getDownloadURL(). 四行代码分别是:

const uuidv4 = require('uuid/v4');
const uuid = uuidv4();
metadata: { firebaseStorageDownloadTokens: uuid }
https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);

这是上下文中的代码:

var webmPromise = new Promise(function(resolve, reject) {
  var options = {
    destination: ('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.mp3'),
    contentType: 'audio/' + audioType,
    metadata: {
      metadata: {
        firebaseStorageDownloadTokens: uuid,
      }
    }
  };

      synthesizeParams.accept = 'audio/webm';
      var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm');
      textToSpeech.synthesize(synthesizeParams)
      .then(function(audio) {
        audio.pipe(file.createWriteStream(options));
      })
      .then(function() {
        resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent('Audio/' + longLanguage + '/' + pronunciation + '/' + word + '.webm') + "?alt=media&token=" + uuid);
      })
      .catch(error => console.error(error));
});

这不是错字——你必须嵌套firebaseStorageDownloadTokensmetadata:!

Doug Stevenson 指出,这firebaseStorageDownloadTokens不是谷歌云存储的官方功能。您不会在任何 Google 文档中找到它,也没有保证它会出现在未来版本的@google-cloud. 我喜欢firebaseStorageDownloadTokens,因为这是获得我想要的东西的唯一方法,但它有一种“气味”,使用起来不安全。

为什么没有来自 Node 的 getDownloadURL()?

正如@Clinton 所写,Google 应该在(即您的 Node 后端)中创建file.getDownloadURL()一个方法。@google-cloud/storage我想从 Google Cloud Functions 上传文件并获取令牌下载 URL。

于 2019-05-06T18:00:35.553 回答
111

以下是有关如何在上传时指定下载令牌的示例:

const UUID = require("uuid-v4");

const fbId = "<YOUR APP ID>";
const fbKeyFile = "./YOUR_AUTH_FIlE.json";
const gcs = require('@google-cloud/storage')({keyFilename: fbKeyFile});
const bucket = gcs.bucket(`${fbId}.appspot.com`);

var upload = (localFile, remoteFile) => {

  let uuid = UUID();

  return bucket.upload(localFile, {
        destination: remoteFile,
        uploadType: "media",
        metadata: {
          contentType: 'image/png',
          metadata: {
            firebaseStorageDownloadTokens: uuid
          }
        }
      })
      .then((data) => {

          let file = data[0];

          return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
      });
}

然后打电话给

upload(localPath, remotePath).then( downloadURL => {
    console.log(downloadURL);
  });

这里的关键是在option 属性中metadata嵌套了一个对象。metadata设置firebaseStorageDownloadTokens为 uuid-v4 值将告诉 Cloud Storage 将其用作其公共身份验证令牌。

非常感谢@martemorfosis

于 2017-05-03T15:46:13.743 回答
33

如果您正在处理 Firebase 项目,则可以在云函数中创建签名 URL,而无需包含其他库或下载凭据文件。您只需启用 IAM API 并将角色添加到您现有的服务帐户(见下文)。

初始化管理库并像往常一样获取文件引用:

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'

admin.initializeApp(functions.config().firebase)

const myFile = admin.storage().bucket().file('path/to/my/file')

然后生成一个签名的 URL

myFile.getSignedUrl({action: 'read', expires: someDateObj}).then(urls => {
    const signedUrl = urls[0]
})

确保您的 Firebase 服务帐户有足够的权限来运行此

  1. 转到 Google API 控制台并启用 IAM API ( https://console.developers.google.com/apis/api/iam.googleapis.com/overview )
  2. 仍然在 API 控制台中,转到主菜单,“IAM & admin” -> “IAM”
  3. 点击“App Engine 默认服务帐号”角色的修改
  4. 点击“添加另一个角色”,添加名为“Service Account Token Creator”的角色
  5. 保存并等待一分钟以传播更改

使用 vanilla Firebase 配置,第一次运行上述代码时,您将收到错误Identity and Access Management (IAM) API has not been used in project XXXXXX before or it is disabled. . 如果您点击错误消息中的链接并启用 IAM API,您将收到另一个错误:Permission iam.serviceAccounts.signBlob is required to perform this operation on service account my-service-account。添加令牌创建者角色修复了第二个权限问题。

于 2018-11-07T19:27:01.077 回答
29

您应该避免在代码中对 URL 前缀进行硬编码,尤其是在有替代方案时。我建议在使用Cloud Storage NodeJS 1.6.x或 +predefinedAcl: 'publicRead'上传文件时使用该选项:

const options = {
    destination: yourFileDestination,
    predefinedAcl: 'publicRead'
};

bucket.upload(attachment, options);

然后,获取公共 URL 非常简单:

bucket.upload(attachment, options).then(result => {
    const file = result[0];
    return file.getMetadata();
}).then(results => {
    const metadata = results[0];
    console.log('metadata=', metadata.mediaLink);
}).catch(error => {
    console.error(error);
});
于 2018-03-21T16:03:31.157 回答
23

随着最近函数对象响应的变化,您可以获得将下载 URL“拼接”在一起所需的一切,如下所示:

 const img_url = 'https://firebasestorage.googleapis.com/v0/b/[YOUR BUCKET]/o/'
+ encodeURIComponent(object.name)
+ '?alt=media&token='
+ object.metadata.firebaseStorageDownloadTokens;

console.log('URL',img_url);
于 2018-04-18T02:02:59.893 回答
21

这是我目前使用的,它很简单,而且可以完美运行。

您无需对 Google Cloud 执行任何操作。它与 Firebase 开箱即用。

// Save the base64 to storage.
const file = admin.storage().bucket('url found on the storage part of firebase').file(`profile_photos/${uid}`);
await file.save(base64Image, {
    metadata: {
      contentType: 'image/jpeg',
    },
    predefinedAcl: 'publicRead'
});
const metaData = await file.getMetadata()
const url = metaData[0].mediaLink

编辑:同样的例子,但上传:

await bucket.upload(fromFilePath, {destination: toFilePath});
file = bucket.file(toFilePath);
metaData = await file.getMetadata()
const trimUrl = metaData[0].mediaLink

#update:无需在上传方法中进行两次不同的调用来获取元数据:

let file = await bucket.upload(fromFilePath, {destination: toFilePath});
const trimUrl = file[0].metaData.mediaLink
于 2019-01-02T15:04:06.237 回答
19

我成功使用的一种方法是firebaseStorageDownloadTokens在文件完成上传后将 UUID v4 值设置为文件元数据中命名的键,然后按照 Firebase 用于生成这些 URL 的结构自己组装下载 URL,例如:

https://firebasestorage.googleapis.com/v0/b/[BUCKET_NAME]/o/[FILE_PATH]?alt=media&token=[THE_TOKEN_YOU_CREATED]

我不知道使用这种方法有多“安全”(鉴于 Firebase 将来可能会改变它生成下载 URL 的方式),但它很容易实现。

于 2017-04-03T23:15:06.933 回答
19

对于那些想知道 Firebase Admin SDK serviceAccountKey.json 文件应该放在哪里的人。只需将其放在函数文件夹中并像往常一样部署即可。

为什么我们不能像在 Javascript SDK 中那样从元数据中获取下载 url,这仍然让我感到困惑。生成一个最终会过期的 url 并将其保存在数据库中是不可取的。

于 2017-04-26T15:00:44.073 回答
11

抱歉,由于缺少声誉,我无法对您的上述问题发表评论,因此我会将其包含在此答案中。

通过生成签名的 URL 执行上述操作,但我认为您必须使用可以生成的 serviceAccountKey.json 而不是使用 service-account.json(相应地替换 YOURPROJECTID)

https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk

例子:

const gcs = require('@google-cloud/storage')({keyFilename: 'serviceAccountKey.json'});
// ...
const bucket = gcs.bucket(bucket);
// ...
return bucket.upload(tempLocalFile, {
        destination: filePath,
        metadata: {
          contentType: 'image/jpeg'
        }
      })
      .then((data) => {
        let file = data[0]
        file.getSignedUrl({
          action: 'read',
          expires: '03-17-2025'
        }, function(err, url) {
          if (err) {
            console.error(err);
            return;
          }

          // handle url 
        })
于 2017-03-23T09:36:07.783 回答
10

我无法评论詹姆斯丹尼尔斯给出的答案,但我认为这是非常重要的阅读。

在许多情况下,像他一样提供签名的 URL 似乎很糟糕,而且可能很危险。根据 Firebase 的文档,签名的 url 会在一段时间后过期,因此将其添加到您的数据库将在一定时间范围后导致空 url

可能是误解了那里的文档并且签名的 url 不会过期,这会导致一些安全问题。每个上传文件的密钥似乎都是相同的。这意味着一旦你获得了一个文件的 url,就可以很容易地访问他不应该访问的文件,只需要知道他们的名字。

如果我误解了这一点,那么我会得到纠正。其他人可能应该更新上述解决方案。如果我可能错了

于 2018-04-30T21:09:07.077 回答
6

如果您使用“publicRead”的预定义访问控制列表值,您可以上传文件并使用非常简单的 url 结构访问它:

// Upload to GCS
const opts: UploadOptions = {
  gzip: true,
  destination: dest, // 'someFolder/image.jpg'
  predefinedAcl: 'publicRead',
  public: true
};
return bucket.upload(imagePath, opts);

然后,您可以像这样构造 url:

const storageRoot = 'https://storage.googleapis.com/';
const bucketName = 'myapp.appspot.com/'; // CHANGE TO YOUR BUCKET NAME
const downloadUrl = storageRoot + bucketName + encodeURIComponent(dest);
于 2019-01-25T05:28:27.053 回答
3

我遇到了同样的问题,但是,我查看的是 firebase 函数示例的代码而不是自述文件。这个线程上的答案也没有帮助......

您可以通过执行以下操作来避免传递配置文件:

转到您项目的Cloud Console > IAM & admin > IAM,找到 App Engine 默认服务帐户并将 Service Account Token Creator 角色添加到该成员。这将允许您的应用为图像创建签名的公共 URL。

来源:自动生成缩略图功能 README

您在应用引擎中的角色应如下所示:

云控制台

于 2018-10-24T13:41:17.040 回答
2

如果您只需要一个带有简单 URL 的公共文件,这很有效。请注意,这可能会推翻您的 Firebase 存储规则。

bucket.upload(file, function(err, file) {
    if (!err) {
      //Make the file public
      file.acl.add({
      entity: 'allUsers',
      role: gcs.acl.READER_ROLE
      }, function(err, aclObject) {
          if (!err) {
              var URL = "https://storage.googleapis.com/[your bucket name]/" + file.id;
              console.log(URL);
          } else {
              console.log("Failed to set permissions: " + err);
          }
      });  
    } else {
        console.log("Upload failed: " + err);
    }
});
于 2018-01-14T12:34:00.137 回答
2

signedURL()使用makePublic()

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp()
var bucket = admin.storage().bucket();

// --- [Above] for admin related operations, [Below] for making a public url from a GCS uploaded object

const { Storage } = require('@google-cloud/storage');
const storage = new Storage();

exports.testDlUrl = functions.storage.object().onFinalize(async (objMetadata) => {
    console.log('bucket, file', objMetadata.bucket + ' ' + objMetadata.name.split('/').pop()); // assuming file is in folder
    return storage.bucket(objMetadata.bucket).file(objMetadata.name).makePublic().then(function (data) {
        return admin.firestore().collection('publicUrl').doc().set({ publicUrl: 'https://storage.googleapis.com/' + objMetadata.bucket + '/' + objMetadata.name }).then(writeResult => {
            return console.log('publicUrl', writeResult);
        });
    });
});
于 2019-09-19T18:08:10.750 回答
2

https://stackoverflow.com/users/269447/laurent的回答效果最好

const uploadOptions: UploadOptions = {
    public: true
};

const bucket = admin.storage().bucket();
[ffile] = await bucket.upload(oPath, uploadOptions);
ffile.metadata.mediaLink // this is what you need
于 2020-02-24T11:56:21.560 回答
1

对于那些使用 Firebase SDK 和admin.initializeApp

1 -生成私钥并放置在 /functions 文件夹中。

2 - 如下配置您的代码:

const serviceAccount = require('../../serviceAccountKey.json');
try { admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) })); } catch (e) {}

文档

try/catch 是因为我正在使用 index.js 导入其他文件并为每个文件创建一个函数。如果您使用具有所有功能的单个 index.js 文件,您应该可以使用admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) }));.

于 2018-05-18T19:02:54.510 回答
1

从 firebase 6.0.0 开始,我可以像这样直接使用管理员访问存储:

const bucket = admin.storage().bucket();

所以我不需要添加服务帐户。然后如上所述设置 UUID 用于获取 firebase url。

于 2018-11-05T01:15:00.730 回答
1

这是我想出来的最好的。这是多余的,但唯一对我有用的合理解决方案。

await bucket.upload(localFilePath, {destination: uploadPath, public: true});
const f = await bucket.file(uploadPath)
const meta = await f.getMetadata()
console.log(meta[0].mediaLink)
于 2019-04-20T15:23:32.207 回答
1

利用file.publicUrl()

异步/等待

const bucket = storage.bucket('bucket-name');
const uploadResponse = await bucket.upload('image-name.jpg');
const downloadUrl = uploadResponse[0].publicUrl();

打回来

const bucket = storage.bucket('bucket-name');
bucket.upload('image-name.jpg', (err, file) => {
  if(!file) {
    throw err;
  }

  const downloadUrl = file.publicUrl();
})

downloadUrl"https://storage.googleapis.com/bucket-name/image-name.jpg"

请注意,为了使上述代码正常工作,您必须公开存储桶或文件。为此,请按照https://cloud.google.com/storage/docs/access-control/making-data-public此处的说明进行操作。另外,我直接导入了@google-cloud/storage包,而不是通过 Firebase SDK。

于 2021-12-31T23:03:05.647 回答
0

我已经在下面的 URL 中发布了我的答案... 您可以在其中获得完整的代码和解决方案

如何使用 Node.js 将 base64 编码图像(字符串)直接上传到 Google Cloud Storage 存储桶?

const uuidv4 = require('uuid/v4');
const uuid = uuidv4();

    const os = require('os')
    const path = require('path')
    const cors = require('cors')({ origin: true })
    const Busboy = require('busboy')
    const fs = require('fs')
    var admin = require("firebase-admin");


    var serviceAccount = {
        "type": "service_account",
        "project_id": "xxxxxx",
        "private_key_id": "xxxxxx",
        "private_key": "-----BEGIN PRIVATE KEY-----\jr5x+4AvctKLonBafg\nElTg3Cj7pAEbUfIO9I44zZ8=\n-----END PRIVATE KEY-----\n",
        "client_email": "xxxx@xxxx.iam.gserviceaccount.com",
        "client_id": "xxxxxxxx",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-5rmdm%40xxxxx.iam.gserviceaccount.com"
      }

    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        storageBucket: "xxxxx-xxxx" // use your storage bucket name
    });


    const app = express();
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
app.post('/uploadFile', (req, response) => {
    response.set('Access-Control-Allow-Origin', '*');
    const busboy = new Busboy({ headers: req.headers })
    let uploadData = null
    busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
        const filepath = path.join(os.tmpdir(), filename)
        uploadData = { file: filepath, type: mimetype }
        console.log("-------------->>",filepath)
        file.pipe(fs.createWriteStream(filepath))
      })

      busboy.on('finish', () => {
        const bucket = admin.storage().bucket();
        bucket.upload(uploadData.file, {
            uploadType: 'media',
            metadata: {
              metadata: { firebaseStorageDownloadTokens: uuid,
                contentType: uploadData.type,
              },
            },
          })

          .catch(err => {
            res.status(500).json({
              error: err,
            })
          })
      })
      busboy.end(req.rawBody)
   });




exports.widgets = functions.https.onRequest(app);
于 2020-01-02T06:23:14.677 回答
0

对于那些尝试使用 token 参数来共享文件并想使用 gsutil 命令的人,我是这样做的:

首先,您需要通过运行进行身份验证:gcloud auth

然后运行:

gsutil setmeta -h "x-goog-meta-firebaseStorageDownloadTokens:$FILE_TOKEN" gs://$FIREBASE_REPO/$FILE_NAME

然后您可以使用以下链接下载文件:

https://firebasestorage.googleapis.com/v0/b/$FIREBASE_REPO/o/$FILE_NAME?alt=media&token=$FILE_TOKEN

于 2020-09-10T13:23:08.220 回答
0

我在管理存储文档上看到了这个

const options = {
  version: 'v4',
  action: 'read',
  expires: Date.now() + 15 * 60 * 1000, // 15 minutes
};

// Get a v4 signed URL for reading the file
const [url] = await storage
  .bucket(bucketName)
  .file(filename)
  .getSignedUrl(options);

console.log('Generated GET signed URL:');
console.log(url);
console.log('You can use this URL with any user agent, for example:');
console.log(`curl '${url}'`);
于 2020-11-09T14:29:35.973 回答
-1

如果您收到错误:

谷歌云函数:require(…) 不是函数

尝试这个:

const {Storage} = require('@google-cloud/storage');
const storage = new Storage({keyFilename: 'service-account-key.json'});
const bucket = storage.bucket(object.bucket);
const file = bucket.file(filePath);
.....
于 2019-09-16T23:22:01.453 回答