我在嘗試瞭解如何使用Node.js在Firebase存儲中上傳文件。我的第一次嘗試是使用火力地堡庫:使用Node.js將文件上傳到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 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>');
能我們使用
gcloud
而不在Google雲端平臺上擁有帳戶?怎麼樣?如果沒有,那麼如何從客戶端上傳文件到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);
});
這是真正有用的,不過,問題的根源仍然存在:用我不能上傳東西'gcloud'(例如,創建一個存儲桶),因爲根據[這個答案](http://stackoverflow.com/a/23136508/1420197),我沒有啓用計費。同樣,爲什麼通過'gcloud'訪問存儲需要計費,而通過客戶端的Firebase訪問存儲不會呢?謝謝! –
我在我的問題中添加了另一個片段。 –
看來你可能需要啓用計費這是真的。我會在內部向團隊報告。我們一直在討論是否應該爲存儲創建Firebase特定的Server SDK,現在的共識是「否」。對於結算問題:作爲解決方法,您可以啓用結算功能,並設置零美元限額的預算,以避免收取任何費用。 API本身應該可以自由使用,並且Firebase Storage使用的存儲桶具有免費配額,因此應該可以正常工作。 – Nivco