当前位置: 首页 > 面试题库 >

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

金何平
2023-03-14
问题内容

我试图了解如何使用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存储不包含在服务器端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>');
  • 我们可以在gcloud没有Google Cloud Platform帐户的情况下使用吗?怎么样?

  • 如果没有,怎么可能从客户端将文件上传到Firebase Storage?

  • 我们不能只创建一个从服务器端发出相同请求的库吗?

  • Firebase Storage到底如何与Google Cloud Platform连接?为什么Firebase允许我们仅从客户端上传图像?

我的第二次尝试是使用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);
});

问题答案:

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

顺便说一句:Firebase项目本质上也是Google Cloud
Platform项目,您可以在https://console.firebase.google.com和https://console.cloud.google.com以及https上访问Firebase项目:
//console.developers.google.com

您可以在Firebase控制台>项目设置或Cloud
Console仪表板中查看您的项目ID

使用gcloud SDK时,请确保使用与Firebase Storage相同的存储桶(已存在)。您可以在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');

...


 类似资料:
  • 但事实证明,Firebase无法从服务器端上传文件,正如它在文档中明确说明的那样: Firebase存储不包括在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户机。 我的第二次尝试是使用库,就像文档中提到的:

  • 我在我的网站上有一个处理文件上传的页面,但是自从我升级了Firebase(我猜是Firebase v7/8)后,这个特殊的功能不再工作了。 为了在firebase存储中处理文件上载,我创建了一个自定义钩子,在这里我使用,因为每次有新的文件值时都需要运行它。我为试图上载的文件传递了一个参数(),并将其存储在数据库中,这样数据库就包含了所有图像的url。然后,我使用这些数据将图像加载到react组件中

  • 我试图上传一个图像文件,我得到了使用Imagepicker。 但上面的代码返回以下错误 VERBOSE-2:ui\u dart\u状态。cc(186)]未处理的异常:MissingPluginException(未找到方法任务的实现#通道插件上的startPutFile.flatter.io/firebase_存储)#0 MethodChannel_invokeMethod包:flatter/..

  • 根据文档,我必须把文件名传递给函数才能上传一个文件。 我想能做这样的事

  • 我从Firebase存储中获取图像,用相机拍照,或者从图书馆中挑选一张。当其中一个完成时,我有一个类来存储,以便在需要时使用它。 现在我需要将此图像上传到Firebase存储(修改或新建,无所谓)。Firebase允许我使用以下选项之一:或,每个选项分别需要或。 我怎么能把我的,并从它获得一个或用于上传? -- 或者,为了解决这个问题,当我从Firebase存储中检索图像时,如何获取图像的? 无论