使用Node.js将文件上传到Firebase存储 [英] Upload files to Firebase Storage using Node.js
问题描述
我试图了解如何使用Node.js在Firebase存储中上传文件。我第一次尝试使用Firebase库:
use strict;
var firebase = require('firebase');
$ b var config = {
apiKey:AIz ... kBY,
authDomain:em .... firebaseapp.com,
databaseURL: https://em ... firebaseio.com,
storageBucket:em .... appspot.com,
messagingSenderId:95 ... 6
};
firebase.initializeApp(config);
//错误:firebase.storage未定义,所以不是函数
var storageRef = firebase.storage()。ref();
var uploadTask = storageRef.child('images / octofez.png')。put(file);
//注册三个观察者:
// 1.'state_changed'观察者,每当状态改变时调用
// 2.错误观察者,失败时调用
//完成观察者,调用成功完成
uploadTask.on('state_changed',function(snapshot){
...
},function(error){
console.error(Something nasty happened,error);
},function(){
var downloadURL = uploadTask.snapshot.downloadURL;
console.log(完成。 ,downloadURL);
});
但事实证明,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>');
-
我们可以使用没有Google云端平台上的帐户,
gcloud
如何将文件从客户端上传到Firebase存储? 我们不能仅仅创建一个从服务器端发出相同请求的库吗? Firebase存储如何与Google云连接平台在所有?为什么Firebase允许我们只从客户端上传图片? >我的第二次尝试是使用
gcloud
库,就像文档中提到的那样: var gcloud = require(gcloud);
//在GAE上运行时,app.yaml会设置以下环境变量,
//但在本地运行时需要手动设置。
//存储客户端用于与Google Cloud Storage进行通信
var storage = gcloud.storage({
projectId:em ...,
keyFilename:'auth .json'
});
storage.createBucket('octocats',function(err,bucket){
//错误:403,accountDisabled
//指定项目的帐户已被禁用
//在桶中创建一个新的blob并上传文件数据
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库时,授权使用服务帐户,因为这会让您有权访问实时数据库。您可以使用同一个服务帐户的凭证文件来授权gcloud 。顺便提一句:Firebase项目本质上也是Google云端平台项目,您可以在 https://console.firebase.google.com 和 https://console.cloud.google.com 和 https://console.developers.google。 com
您可以在 Firebase上看到您的项目ID控制台>项目设置或在云控制台仪表板中
使用gcloud SDK时,请确保您使用的是Firebase存储正在使用的(已经存在的)相同的存储分区。您可以在Firebase网站 config
对象或Firebase存储标签中找到存储桶名称。基本上你的代码应该像这样开始:
var gcloud = require('gcloud');
var storage = gcloud.storage({
projectId:'< projectID>',
keyFilename:'service-account-credentials.json'
}) ;
var bucket = storage.bucket('< projectID> .appspot.com');
...
I'm trying to understand how to upload files in Firebase Storage, using Node.js. My first try was to use the Firebase library:
"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);
});
But it turns out that Firebase cannot upload files from the server side, as it clearly states in the docs:
Firebase Storage is not included in the server side Firebase npm module. Instead, you can use the gcloud Node.js client.
$ npm install --save gcloud
In your code, you can access your Storage bucket using:
var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage(); var bucket = gcs.bucket('<your-firebase-storage-bucket>');
Can we use
gcloud
without having an account on Google Cloud Platform? How?If not, how come that uploading files to Firebase Storage from the client side is possible?
Can't we just create a library that makes the same requests from the server side?
How is Firebase Storage connected with Google Cloud Platform at all? Why Firebase allows us to upload images only from the client side?
My second try was to use the gcloud
library, like mentioned in the docs:
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);
});
When using the firebase library on a server you would typically authorize using a service account as this will give you admin access to the Realtime database for instance. You can use the same Service Account's credentials file to authorize gcloud.
By the way: A Firebase project is essentially also a Google Cloud Platform project, you can access your Firebase project on both https://console.firebase.google.com and https://console.cloud.google.com and https://console.developers.google.com You can see your Project ID on the Firebase Console > Project Settings or in the Cloud Console Dashboard
When using the gcloud SDK make sure that you use the (already existing) same bucket that Firebase Storage is using. You can find the bucket name in the Firebase web config
object or in the Firebase Storage tab. Basically your code should start like this:
var gcloud = require('gcloud');
var storage = gcloud.storage({
projectId: '<projectID>',
keyFilename: 'service-account-credentials.json'
});
var bucket = storage.bucket('<projectID>.appspot.com');
...
这篇关于使用Node.js将文件上传到Firebase存储的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!