2016-10-04 20 views
16

Tôi đang cố gắng hiểu cách tải lên tệp trong Bộ nhớ Firebase, sử dụng Node.js. thử đầu tiên của tôi là sử dụng thư viện căn cứ hỏa lực:Tải tệp lên Bộ nhớ Firebase bằng Node.js

"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); 
}); 

Nhưng nó chỉ ra rằng căn cứ hỏa lực không thể tải tập tin từ phía máy chủ, vì nó nêu rõ trong tài liệu:

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>'); 
  • thể chúng tôi sử dụng gcloud mà không cần có tài khoản trên Google Cloud Platform? Làm sao?

  • Nếu không, làm cách nào để tải tệp lên bộ nhớ Firebase từ phía máy khách là có thể?

  • Chúng ta có thể tạo một thư viện có cùng yêu cầu từ phía máy chủ không?

  • Bộ nhớ Firebase được kết nối với Google Cloud Platform như thế nào? Tại sao Firebase chỉ cho phép chúng tôi tải lên hình ảnh từ phía khách hàng?


thử thứ hai của tôi là sử dụng thư viện gcloud, như đã đề cập trong các tài liệu:

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

Trả lời

14

Khi sử dụng thư viện căn cứ hỏa lực trên máy chủ bạn sẽ thường ủy quyền cho using a service account vì điều này sẽ cung cấp cho bạn quản trị truy cập vào cơ sở dữ liệu thời gian thực chẳng hạn. Bạn có thể sử dụng cùng một tệp thông tin xác thực của Tài khoản dịch vụ tới authorize gcloud.

Bằng cách này: Một dự án căn cứ hỏa lực là chủ yếu cũng là một dự án Google Cloud Platform, bạn có thể truy cập vào dự án căn cứ hỏa lực của bạn trên cả https://console.firebase.google.comhttps://console.cloud.google.comhttps://console.developers.google.com Bạn có thể thấy ID dự án của bạn trên Firebase Console > Project Settings hoặc trong Cloud Console Dashboard

Khi sử dụng gcloud SDK, hãy đảm bảo rằng bạn sử dụng nhóm đã có (đã tồn tại) mà Bộ nhớ Firebase đang sử dụng. Bạn có thể tìm tên nhóm trong đối tượng config trên web Firebase hoặc trong tab Bộ nhớ Firebase. Về cơ bản, mã của bạn sẽ bắt đầu như thế này:

var gcloud = require('gcloud'); 

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

var bucket = storage.bucket('<projectID>.appspot.com'); 

... 
+0

Đó là thực sự hữu ích, nhưng vẫn còn, vấn đề gốc rễ vẫn còn đó: Tôi không thể tải lên những thứ sử dụng 'gcloud' (ví dụ, tạo một thùng) vì, theo [câu trả lời này] (http://stackoverflow.com/a/23136508/1420197), tôi đã không kích hoạt thanh toán. Một lần nữa, tại sao truy cập Storage thông qua 'gcloud' sẽ yêu cầu thanh toán trong khi truy cập vào nó thông qua firebase phía khách hàng sẽ không? Cảm ơn! –

+0

Tôi đã thêm một đoạn mã khác vào câu hỏi của mình. –

+0

Có vẻ như bạn có thể cần bật tính năng thanh toán này là đúng sự thật.Tôi sẽ báo cáo cho nhóm trong nội bộ. Luôn luôn có cuộc tranh luận liệu chúng ta có nên tạo SDK máy chủ cụ thể Firebase cho Bộ nhớ và bây giờ sự đồng thuận là "không". Đối với vấn đề thanh toán: là giải pháp thay thế, bạn có thể bật thanh toán và đặt ngân sách với giới hạn Zero USD để tránh bị tính hóa đơn. Bản thân API nên được sử dụng miễn phí và nhóm mà Firebase Storage sử dụng có hạn ngạch miễn phí nên mọi thứ sẽ hoạt động. – Nivco

2

Lưu ý rằng gcloud không được dùng nữa, sử dụng google-cloud thay thế. Bạn có thể tìm thấy SERVICE_ACCOUNT_KEY_FILE_PATH tại cài đặt dự án-> Tài khoản dịch vụ.

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

căn cứ hỏa lực lưu trữ hiện đang được hỗ trợ bởi SDK quản trị với 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

Khi tôi thử điều này, tôi nhận được 'TypeError: defaultStorage không phải là một hàm'. Với thư viện npm 'firebase-admin' mới nhất. –

+0

'var bucket = firebaseAdmin.storage(). Bucket ('bucketName');' - mẹo đó, sau đây là hướng dẫn: https://firebase.google.com/docs/storage/admin/start#use_a_custom_firebase_app –

Các vấn đề liên quan