我正在尝试使用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);
});
但事实证明,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");
// 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);
});
答案 0 :(得分:17)
在服务器上使用firebase库时,您通常会授权using a service account,因为这将为您提供管理员访问Realtime数据库的权限。您可以使用相同的服务帐户的凭据文件authorize gcloud。
顺便说一句:Firebase项目本质上也是一个Google Cloud Platform项目,您可以在https://console.firebase.google.com和https://console.cloud.google.com以及https://console.developers.google.com访问您的Firebase项目 您可以在Firebase Console > Project Settings或Cloud Console Dashboard
中查看您的项目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');
...
答案 1 :(得分:15)
带有NodeJS的管理员SDK现在支持Firebase存储:
https://firebase.google.com/docs/reference/admin/node/admin.storage
// Get the Storage service for the default app
var defaultStorage = firebaseAdmin.storage();
var bucket = defaultStorage.bucket('bucketName');
...
答案 2 :(得分:3)
Firebase Admin SDK允许您直接访问Google云端存储。
有关更多详细信息,请访问Introduction to the Admin Cloud Storage API
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: "<BUCKET_NAME>.appspot.com"
});
var bucket = admin.storage().bucket();
bucket.upload('Local file to upload, e.g. ./local/path/to/file.txt')
答案 3 :(得分:2)
请注意,gcloud已弃用,请改用google-cloud。 您可以在项目设置 - >服务帐户中找到SERVICE_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');
...
答案 4 :(得分:0)
希望对您有用。我从本地上传了一个文件,然后在上传到Firebase存储中之后使用UUID添加了访问令牌,然后生成了下载URL。如果我们点击生成的网址,它将自动下载文件。
$params = array('updatePersonFields' => 'names,emailAddresses');
$people_service->people->updateContact($google_id,$person,$params);
答案 5 :(得分:-1)
或者您可以像这样简单地填充XmlHttpRequest
-
const XMLHttpRequest = require("xhr2");
global.XMLHttpRequest = XMLHttpRequest
并导入
require('firebase/storage');
就是这样。现在,所有firebase.storage()
方法都可以使用。