Загружайте файлы в хранилище Firebase с помощью Node.js
Я пытаюсь понять, как загружать файлы в Firebase Storage, используя 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 не может загружать файлы со стороны сервера, как это четко указано в документах:
Хранилище 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>');
-
Можно ли использовать gcloud
, не имея учетной записи на Google Cloud Platform? Как?
-
Если нет, то возможно ли, что загрузка файлов в хранилище 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);
});
Ответы
Ответ 1
При использовании библиотеки firebase на сервере вы обычно авторизуете с помощью учетной записи службы, поскольку это даст вам доступ администратора к базе данных Realtime для пример. Вы можете использовать тот же файл учетных данных учетной записи службы authorize gcloud.
Кстати: проект Firebase - это также проект Google Cloud Platform, вы можете получить доступ к проекту Firebase как на https://console.firebase.google.com, так и https://console.cloud.google.com и https://console.developers.google.com
Вы можете увидеть свой идентификатор проекта на Firebase Console > Настройки проекта или в Панель управления Cloud Console
При использовании gcloud SDK убедитесь, что вы используете (уже существующее) то же самое ведро, которое использует Firebase Storage. Имя ведра можно найти в веб-сайте 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');
...
Ответ 2
Firebase Storage теперь поддерживается административным 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');
...
Ответ 3
Обратите внимание, что 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
Firebase Admin SDK позволяет получить прямой доступ к облачному хранилищу Google.
Для более подробной информации посетите Введение в API 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')
Ответ 5
Я надеюсь, что это будет полезно для вас. Я загрузил один файл локально, а затем добавил токен доступа, используя UUID, после чего я загрузил его в хранилище Firebase. Там после того, как я генерирую URL-адрес загрузки. Если мы нажмем на этот URL, он автоматически загрузит файл.
const keyFilename="./xxxxx.json"; //replace this with api key file
const projectId = "xxxx" //replace with your project id
const bucketName = "xx.xx.appspot.com"; //Add your bucket name
var mime=require('mime-types');
const { Storage } = require('@google-cloud/storage');
const uuidv1 = require('uuid/v1');//this for unique id generation
const gcs = new Storage({
projectId: projectId,
keyFilename: './xxxx.json'
});
const bucket = gcs.bucket(bucketName);
const filePath = "./sample.odp";
const remotePath = "/test/sample.odp";
const fileMime = mime.lookup(filePath);
//we need to pass those parameters for this function
var upload = (filePath, remoteFile, fileMime) => {
let uuid = uuidv1();
return bucket.upload(filePath, {
destination: remoteFile,
uploadType: "media",
metadata: {
contentType: fileMime,
metadata: {
firebaseStorageDownloadTokens: uuid
}
}
})
.then((data) => {
let file = data[0];
return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
});
}
//This function is for generation download url
upload(filePath, remotePath, fileMime).then( downloadURL => {
console.log(downloadURL);
});
Ответ 6
Или вы можете просто заполнить XmlHttpRequest
следующим образом:
const XMLHttpRequest = require("xhr2");
global.XMLHttpRequest = XMLHttpRequest
и импорт
require('firebase/storage');
Это. Все методы firebase.storage()
теперь должны работать.