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'')
Firebase Storage ahora es compatible con el SDK de administración con 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'');
...
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'');
...