使用Node.js将file upload到Firebase存储

我正在尝试了解如何使用Node.js在Firebase存储中上传文件。 我的第一个尝试是使用Firebase库:

"use strict"; var firebase = require('firebase'); var config = { apiKey: "AIz...kBY", authDomain: "em....firebaseapp.com", databaseURL: "https://em....firebaseio.com", storageBucket: "em....appspot.com", messagingSenderId: "95...6" }; firebase.initializeApp(config); // Error: firebase.storage is undefined, so not a function var storageRef = firebase.storage().ref(); var uploadTask = storageRef.child('images/octofez.png').put(file); // Register three observers: // 1. 'state_changed' observer, called any time the state changes // 2. Error observer, called on failure // 3. Completion observer, called on successful completion uploadTask.on('state_changed', function(snapshot){ ... }, function(error) { console.error("Something nasty happened", error); }, function() { var downloadURL = uploadTask.snapshot.downloadURL; console.log("Done. Enjoy.", downloadURL); }); 

但事实certificate,Firebase无法从服务器端上传文件,因为它在文档中明确指出:

Firebase存储不包含在服务器端Firebase npm模块中。 相反,您可以使用gcloud Node.js客户端。

$ npm install --save gcloud

在您的代码中,您可以使用以下方式访问您的存储桶:

 var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage(); var bucket = gcs.bucket('<your-firebase-storage-bucket>'); 
  • 我们可以gcloud没有Google云端平台帐户的情况下使用gcloud吗? 怎么样?

  • 如果没有,那么如何从客户端上传文件到Firebase存储是可能的?

  • 我们不能仅仅创build一个从服务器端发出相同请求的库吗?

  • Firebase存储如何与Google云端平台连接? 为什么Firebase只允许我们从客户端上传图片?


我第二次尝试使用gcloud库,就像文档中提到的那样:

 var gcloud = require("gcloud"); // The following environment variables are set by app.yaml when running on GAE, // but will need to be manually set when running locally. // The storage client is used to communicate with Google Cloud Storage var storage = gcloud.storage({ projectId: "em...", keyFilename: 'auth.json' }); storage.createBucket('octocats', function(err, bucket) { // Error: 403, accountDisabled // The account for the specified project has been disabled. // Create a new blob in the bucket and upload the file data. var blob = bucket.file("octofez.png"); var blobStream = blob.createWriteStream(); blobStream.on('error', function (err) { console.error(err); }); blobStream.on('finish', function () { var publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`; console.log(publicUrl); }); fs.createReadStream("octofez.png").pipe(blobStream); }); 

在服务器上使用Firebase库时,您通常会使用服务帐户进行授权,因为这会让您有权访问Realtime数据库。 您可以使用相同的服务帐户的凭据文件来授权gcloud 。

顺便说一句:Firebase项目本质上也是Google云端平台项目,您可以通过https://console.firebase.google.com和https://console.cloud.google.com以及https&#xFF1A; //console.developers.google.com您可以在Firebase控制台>项目设置或云控制台信息中心中看到您的项目ID

使用gcloud SDK时,请确保您使用的是Firebase存储正在使用的(已经存在的)相同的存储分区。 您可以在Firebasenetworkingconfig对象或Firebase存储标签中find存储桶名称。 基本上你的代码应该像这样开始:

 var gcloud = require('gcloud'); var storage = gcloud.storage({ projectId: '<projectID>', keyFilename: 'service-account-credentials.json' }); var bucket = storage.bucket('<projectID>.appspot.com'); ... 

Firebase存储现在由具有NodeJS的pipe理员SDK支持:

https://firebase.google.com/docs/reference/admin/node/admin.storage

请注意,gcloud已弃用,请改为使用google-cloud。 您可以在项目设置 – >服务帐户中findSERVICE_ACCOUNT_KEY_FILE_PATH。

 var storage = require('@google-cloud/storage'); var gcs = storage({ projectId: PROJECT_ID, keyFilename: SERVICE_ACCOUNT_KEY_FILE_PATH }); // Reference an existing bucket. var bucket = gcs.bucket(PROJECT_ID + '.appspot.com'); ... 
Interesting Posts