web-dev-qa-db-fra.com

Télécharger des fichiers sur Firebase Storage à l'aide de Node.js

J'essaie de comprendre comment télécharger des fichiers dans Firebase Storage en utilisant Node.js. Mon premier essai a été d'utiliser la bibliothèque 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);
});

Mais il s’avère que Firebase ne peut pas télécharger de fichiers côté serveur, comme il est clairement indiqué dans la documentation:

Firebase Storage n'est pas inclus dans le module Firebase npm côté serveur. Au lieu de cela, vous pouvez utiliser le client gcloud Node.js.

$ npm install --save gcloud

Dans votre code, vous pouvez accéder à votre compartiment de stockage à l'aide de:

var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage();
var bucket = gcs.bucket('<your-firebase-storage-bucket>');
  • Pouvons-nous utiliser gcloud sans avoir de compte sur Google Cloud Platform? Comment?

  • Sinon, comment se fait-il que le téléchargement de fichiers sur Firebase Storage à partir du client est possible?

  • Ne pouvons-nous pas simplement créer une bibliothèque qui fait les mêmes demandes du côté serveur?

  • Comment Firebase Storage est-il connecté à Google Cloud Platform? Pourquoi Firebase nous permet de télécharger des images uniquement du côté client?


Ma deuxième tentative a été d'utiliser la bibliothèque gcloud, comme mentionné dans la documentation:

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);
});
24
Ionică Bizău

Lorsque vous utilisez la bibliothèque firebase sur un serveur, vous autorisez généralement à l'aide d'un compte de service , car cela vous donnera un accès administrateur à la base de données Realtime, par exemple. Vous pouvez utiliser le fichier d'informations d'identification du même compte de service pour authorize gcloud

Soit dit en passant: un projet Firebase est essentiellement aussi un projet Google Cloud Platform, vous pouvez accéder à votre projet Firebase à la fois sur https://console.firebase.google.com et https://console.cloud. google.com et https://console.developers.google.com Vous pouvez voir votre ID de projet sur Console Firebase> Paramètres du projet ou dans le Tableau de bord de la console cloud

Lorsque vous utilisez le kit de développement de gcloud, assurez-vous d’utiliser le même compartiment (déjà existant) utilisé par Firebase Storage. Vous pouvez trouver le nom du compartiment dans l'objet Web config de Firebase ou dans l'onglet Stockage de Firebase. Fondamentalement, votre code devrait commencer comme ceci:

var gcloud = require('gcloud');

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

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

...
18
Nicolas Garnier

Firebase Storage est maintenant pris en charge par le SDK administrateur avec 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');
...
12
Laurent

Notez que gcloud est obsolète, utilisez plutôt google-cloud. Vous pouvez trouver SERVICE_ACCOUNT_KEY_FILE_PATH dans les paramètres du projet-> Comptes de service. 

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

...
2
MrRhoads

J'espère que cela vous sera utile. J'ai téléchargé un fichier à partir de localement, puis j'ai ajouté l'accès Token à l'aide de l'UUID, après l'avoir chargée dans le stockage firebase. Après avoir généré l'URL de téléchargement, Si nous tapons sur cette URL, nous allons automatiquement télécharger un fichier.

    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 uuidv1 = require('uuid/v1');//this for unique id generation

    //const mime = require('mime');
    const gcs = require('@google-cloud/storage')({
        projectId,
        keyFilename
    });

    const bucket = gcs.bucket(bucketName);

    const filePath = "./sample.odp";
    const remotePath = "/XXXX";
    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);

      });
0