node last google functions fire almacenamiento javascript node.js firebase gcloud firebase-storage

javascript - last - google cloud storage



Cargue archivos en Firebase Storage usando Node.js (6)

Estoy tratando de entender cómo cargar archivos en Firebase Storage, usando Node.js. Mi primer intento fue usar la biblioteca 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); });

Pero resulta que Firebase no puede cargar archivos desde el lado del servidor, como lo indica claramente en los documentos:

Firebase Storage no está incluido en el módulo npm de Firebase del lado del servidor. En su lugar, puede usar el cliente gcloud Node.js.

$ npm install --save gcloud

En su código, puede acceder a su depósito de Almacenamiento usando:

var gcloud = require(''gcloud'')({ ... }); var gcs = gcloud.storage(); var bucket = gcs.bucket(''<your-firebase-storage-bucket>'');

  • ¿Podemos usar gcloud sin tener una cuenta en Google Cloud Platform? ¿Cómo?

  • Si no, ¿cómo es posible cargar archivos a Firebase Storage desde el lado del cliente?

  • ¿No podemos simplemente crear una biblioteca que haga las mismas solicitudes desde el lado del servidor?

  • ¿Cómo se conecta Firebase Storage con Google Cloud Platform? ¿Por qué Firebase nos permite cargar imágenes solo desde el lado del cliente?

Mi segundo intento fue usar la biblioteca gcloud , como se menciona en los documentos:

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


Al usar la biblioteca firebase en un servidor, normalmente autorizaría el uso de una cuenta de servicio, ya que esto le dará acceso de administrador a la base de datos en tiempo real, por ejemplo. Puede usar el mismo archivo de credenciales de la cuenta de servicio para autorizar gcloud .

Por cierto: un proyecto de Firebase es esencialmente un proyecto de Google Cloud Platform, puede acceder a su proyecto de Firebase en https://console.firebase.google.com y https://console.cloud.google.com y https: //console.developers.google.com Puedes ver tu ID de proyecto en Firebase Console> Configuración del proyecto o en el Panel de la consola de la nube

Cuando use el SDK de gcloud, asegúrese de usar el mismo depósito (ya existente) que Firebase Storage está usando. Puedes encontrar el nombre del depósito en el objeto de config web de Firebase o en la pestaña Almacenamiento de Firebase. Básicamente su código debería comenzar así:

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


Espero que te sea útil. Subí un archivo localmente y luego agregué Token de acceso usando UUID después de eso lo cargué en el almacenamiento de Firebase. Luego, estoy generando la URL de descarga. Si presionamos esa URL de generación, se descargará automáticamente un archivo.

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


Firebase Admin SDK te permite acceder directamente a Google Cloud Storage.

Para obtener más detalles, visite Introducción a la API de Admin Cloud Storage

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



O simplemente podría polyfill XmlHttpRequest así:

const XMLHttpRequest = require("xhr2"); global.XMLHttpRequest = XMLHttpRequest

e importar

require(''firebase/storage'');

Eso es. Todos los métodos firebase.storage() ahora deberían funcionar.


Tenga en cuenta que gcloud está en desuso, use google-cloud en su lugar. Puede encontrar SERVICE_ACCOUNT_KEY_FILE_PATH en la configuración del proyecto-> Cuentas de servicio.

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