web-dev-qa-db-ja.com

Node.jsを使用してファイルをFirebase Storageにアップロードする

Node.jsを使用して、Firebase Storageにファイルをアップロードする方法を理解しようとしています。私の最初の試みは、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 Storageは、サーバー側の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>');
  • Google Cloud Platformにアカウントを持たずにgcloudを使用できますか?どうやって?

  • そうでない場合、クライアント側からFirebase Storageにファイルをアップロードできるのはなぜですか?

  • サーバー側から同じリクエストを行うライブラリを作成することはできませんか?

  • Firebase StorageはどのようにGoogle Cloud Platformと接続されていますか? Firebaseでクライアント側からのみ画像をアップロードできるのはなぜですか?


私の2番目の試みは、ドキュメントで言及されているように、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);
});
30
Ionică Bizău

サーバーでfirebaseライブラリを使用する場合は、通常、 サービスアカウントを使用 を承認します。これにより、たとえば、リアルタイムデータベースへの管理者アクセスが許可されます。同じサービスアカウントの認証情報ファイルを gcloudの承認 に使用できます。

ちなみに、Firebaseプロジェクトは本質的にGoogle Cloud Platformプロジェクトでもあり、Firebaseプロジェクトには https://console.firebase.google.comhttps:/の両方でアクセスできます/console.cloud.google.com および https://console.developers.google.com プロジェクトIDは Firebase Console> Project Settings で確認できますまたは クラウドコンソールダッシュボード

Gcloud SDKを使用するときは、Firebase Storageが使用している(既存の)同じバケットを使用していることを確認してください。バケット名は、Firebase web configオブジェクトまたはFirebase Storageタブで見つけることができます。基本的に、コードは次のように開始する必要があります。

var gcloud = require('gcloud');

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

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

...
17
Nicolas Garnier

Firebase Storageは、NodeJSを備えたadmin SDKでサポートされるようになりました。

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

Firebase Admin SDKを使用すると、Google Cloud Storageに直接アクセスできます。

詳細については、 Admin 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')
3
Madhav

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

...
2
MrRhoads

あなたの役に立つことを願っています。ローカルからファイルを1つアップロードし、その後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);

      });