web-dev-qa-db-de.com

Laden Sie Dateien mit Node.js in Firebase Storage hoch

Ich versuche zu verstehen, wie man Dateien in Firebase Storage mit Node.js lädt. Mein erster Versuch war die Verwendung der Firebase-Bibliothek:

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

Es stellt sich jedoch heraus, dass Firebase keine Dateien von Server hochladen kann, da dies in den Dokumenten eindeutig angegeben ist:

Firebase Storage ist nicht im serverseitigen Firebase npm-Modul enthalten. Stattdessen können Sie den gcloud Node.js-Client verwenden.

$ npm install --save gcloud

In Ihrem Code können Sie auf Ihren Storage-Bucket zugreifen:

var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage();
var bucket = gcs.bucket('<your-firebase-storage-bucket>');
  • Können wir gcloud verwenden, ohne ein Konto bei Google Cloud Platform zu haben? Wie?

  • Wenn nicht, wie ist es möglich, dass Dateien vom Client aus in Firebase Storage hochgeladen werden können?

  • Können wir nicht einfach eine Bibliothek erstellen, die vom Server aus die gleichen Anforderungen stellt?

  • Wie ist Firebase Storage überhaupt mit der Google Cloud-Plattform verbunden? Warum erlaubt Firebase das Hochladen von Bildern nur vom Client aus?


Mein zweiter Versuch war, die gcloud-Bibliothek zu verwenden, wie in den Dokumenten erwähnt:

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

Bei Verwendung der Firebase-Bibliothek auf einem Server würden Sie normalerweise über ein Dienstkonto autorisieren, da Sie dem Administrator beispielsweise Zugriff auf die Echtzeit-Datenbank haben. Sie können die Berechtigungsdatei des Dienstkontos für autorize gcloud verwenden. 

Übrigens: Ein Firebase-Projekt ist im Wesentlichen auch ein Google Cloud Platform-Projekt. Sie können auf Ihr Firebase-Projekt unter https://console.firebase.google.com und https: // console) zugreifen .cloud.google.com und https://console.developers.google.com .__ Sie können Ihre Projekt-ID auf der Firebase-Konsole> Projekteinstellungen oder anzeigen im Cloud Console Dashboard

Wenn Sie das gcloud-SDK verwenden, stellen Sie sicher, dass Sie den (bereits vorhandenen) Bucket verwenden, den Firebase Storage verwendet. Sie finden den Bucket-Namen im Firebase-Webobjekt config oder auf der Registerkarte Firebase-Speicher. Grundsätzlich sollte Ihr Code so beginnen:

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 wird jetzt vom Admin-SDK mit NodeJS unterstützt:

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

Mit dem Firebase Admin SDK können Sie direkt auf Ihren Google Cloud-Speicher zugreifen.

Weitere Informationen finden Sie unter Einführung in die Admin-Cloud-Speicher-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')
3
Madhav

Beachten Sie, dass gcloud veraltet ist. Verwenden Sie stattdessen google-cloud. Sie finden SERVICE_ACCOUNT_KEY_FILE_PATH unter Projekteinstellungen-> Dienstkonten. 

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

Ich hoffe es wird für dich nützlich sein. Ich habe eine Datei von lokal hochgeladen und dann das Zugriffstoken mit UUID hinzugefügt, nachdem ich es in den Firebase-Speicher hochgeladen habe. Danach generiere ich eine Download-URL. Wenn wir auf diese generierte URL klicken, wird automatisch eine Datei heruntergeladen.

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

      });