Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js将文件上载到Firebase存储_Javascript_Node.js_Firebase_Gcloud_Firebase Storage - Fatal编程技术网

Javascript 使用Node.js将文件上载到Firebase存储

Javascript 使用Node.js将文件上载到Firebase存储,javascript,node.js,firebase,gcloud,firebase-storage,Javascript,Node.js,Firebase,Gcloud,Firebase Storage,我试图了解如何使用Node.js在Firebase存储中上传文件。我的第一次尝试是使用Firebase库: "use strict"; var firebase = require('firebase'); var config = { apiKey: "AIz...kBY", authDomain: "em....firebaseapp.com", databaseURL: "https://em

我试图了解如何使用Node.js在Firebase存储中上传文件。我的第一次尝试是使用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无法从服务器端上传文件,因为它在文档中明确指出:

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);
});
服务器端Firebase npm模块中不包括Firebase存储。相反,您可以使用gcloud Node.js客户端

$npm安装--保存gcloud

在代码中,您可以使用以下方式访问存储桶:

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

当在服务器上使用firebase库时,您通常会进行授权,因为这将授予您对实时数据库的管理员访问权限。您可以使用同一服务帐户的凭据文件来创建

顺便说一下:Firebase项目本质上也是一个Google云平台项目,您可以在和上访问您的Firebase项目 您可以在或中看到您的项目ID

使用gcloud SDK时,请确保使用Firebase存储正在使用的相同存储桶(已存在)。您可以在Firebase web
config
对象或Firebase存储选项卡中找到存储桶名称。基本上,您的代码应该这样开始:

var gcloud = require('gcloud');

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

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

...
var gcloud=require('gcloud');
var storage=gcloud.storage({
projectId:“”,
keyFilename:'服务帐户凭据.json'
});
var bucket=storage.bucket('.appspot.com');
...

请注意,gcloud已被弃用,请改用谷歌云。 您可以在项目设置->服务帐户中找到服务帐户\密钥\文件\路径

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

...

Firebase存储现在由带有NodeJS的admin SDK支持:


我希望它对你有用。我从本地上传了一个文件,然后我使用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);

      });

或者您可以简单地使用polyfill
XmlHttpRequest
这样-

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

require('firebase/storage');

就这样。所有
firebase.storage()
方法现在都可以工作。

firebase管理SDK允许您直接访问您的谷歌云存储

欲了解更多详情,请访问

var admin=require(“firebase admin”);
var servicecomport=require(“path/to/servicecomportkey.json”);
admin.initializeApp({
凭证:管理员凭证证书(serviceAccount),
storageBucket:“.appspot.com”
});
var bucket=admin.storage().bucket();
bucket.upload('要上载的本地文件,例如../Local/path/to/file.txt')

这确实很有帮助,但根本问题仍然存在:我无法使用
gcloud
上传内容(例如,创建一个bucket),因为根据,我没有启用计费功能。同样,为什么通过
gcloud
访问存储需要付费,而通过客户端firebase访问存储则不需要付费?谢谢我在我的问题中添加了另一个片段。看来您可能需要启用计费。这是真的。我将向团队内部汇报。我们是否应该为存储创建特定于Firebase的服务器SDK一直存在争议,目前的共识是“不”。对于计费问题:作为一种解决方法,您可以启用计费,并将预算设置为零美元,以避免收取任何费用。API本身应该可以自由使用,Firebase Storage使用的bucket有一个免费配额,所以一切都应该正常工作。对我来说,启用计费似乎是个问题,我需要一个计费帐户。对于账单账户,我需要在谷歌云平台上注册,在那里注册我需要一个业务。所有这些只是为了从服务器端上传Firebase存储中的内容。我很好奇他们会说什么。谢谢
gloud
现在被弃用当我尝试此操作时,我得到
TypeError:defaultStorage不是一个函数
。使用最新的
firebase admin
npm库。
var bucket=firebaseAdmin.storage().bucket('bucketName')-这就是诀窍,下面作为指导:在
bucket()
之后是什么来获取ref()?这些方法似乎有效:bucket.ref()或bucket.child('path')类型错误:firebase.storage不是一个函数如何在存储上下载文件?使用该方法谢谢您的回答!但是,您可以分享一个如何使用getDownloadURL()的示例吗?再次感谢。
const destFilename='文件的本地目标,例如../Local/path/to/file.txt'
const options={
//文件应下载到的路径,例如“/file.txt”
目的地:destFilename,
}
bucket.file('Remote file to download,例如file.txt')。下载(选项)
ref@Learn2Code上述代码将文件从存储下载到本地。按照您的说明进行设置后,如何下载图像?类型错误:存储不是功能。您使用的是哪个版本的@google cloud/storage?我的是4.5.0
require('firebase/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')