2016-10-04 93 views
16

我在嘗試瞭解如何使用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); 
}); 

回答

14

當使用服務器上的火力點庫,您通常會授權using a service account,因爲這將給例如,您可以管理對實時數據庫的訪問。您可以使用與authorize gcloud相同的服務帳戶的憑證文件。

順便說一句:一個火力地堡項目本質上是也是谷歌雲平臺項目,你可以同時https://console.firebase.google.comhttps://console.cloud.google.comhttps://console.developers.google.com 訪問您的火力地堡的項目你可以看到在Firebase Console > Project Settings您的項目ID或Cloud Console Dashboard

使用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'); 

... 
+0

這是真正有用的,不過,問題的根源仍然存在:用我不能上傳東西'gcloud'(例如,創建一個存儲桶),因爲根據[這個答案](http://stackoverflow.com/a/23136508/1420197),我沒有啓用計費。同樣,爲什麼通過'gcloud'訪問存儲需要計費,而通過客戶端的Firebase訪問存儲不會呢?謝謝! –

+0

我在我的問題中添加了另一個片段。 –

+0

看來你可能需要啓用計費這是真的。我會在內部向團隊報告。我們一直在討論是否應該爲存儲創建Firebase特定的Server SDK,現在的共識是「否」。對於結算問題:作爲解決方法,您可以啓用結算功能,並設置零美元限額的預算,以避免收取任何費用。 API本身應該可以自由使用,並且Firebase Storage使用的存儲桶具有免費配額,因此應該可以正常工作。 – Nivco

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'); 

... 
7

火力地堡存儲現在被管理員SDK用的NodeJS支持:

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'); 
... 
+0

當我嘗試這個,我得到'TypeError:defaultStorage不是一個函數'。使用最新的'firebase-admin' npm庫。 –

+0

'var bucket = firebaseAdmin.storage()。bucket('bucketName');' - 這個技巧,以下爲指導:https://firebase.google.com/docs/storage/admin/start#use_a_custom_firebase_app –

相關問題