【问题标题】:Node JS / Firebase Admin SDK / Firebase Storage - base64 image uploaded to firebase storage is not generating previewNode JS / Firebase Admin SDK / Firebase Storage - 上传到 Firebase 存储的 base64 图像未生成预览
【发布时间】:2021-07-24 16:26:52
【问题描述】:

我正在尝试将从 Angular 前端接收到的 base64 图像保存到 firebase 存储目录中。但是由于某种原因,保存在 firebase 文件夹中的图像没有生成预览。在尝试检索图像文件时,我也无法获得图像文件的签名 URL。

我正在使用 firebase admin-sdk 生成存储桶引用 - 'storageRef'。

在节点后端接收到的图像数据似乎很好,我使用在线 base64 解码器进行了测试,并正确地重新生成了原始图像。谁能告诉我这里出了什么问题?

exports.createContent = async(req, res, next) => {

  // Add a new document with a generated id.
  const writer = await db.collection('feeds').doc(req.body.language).collection(req.body.type).add({
  author: req.body.author,
  cat: req.body.cat,
  content: req.body.content,
  createdAt: admin.firestore.Timestamp.fromDate(new Date(req.body.createdAt)),
  excerpt: req.body.excerpt,
  lastEdit: admin.firestore.Timestamp.fromDate(new Date(req.body.lastEdit)),
  media: req.body.media,
  os_android: req.body.os_android === 'true' ? true : false,
  os_ios: req.body.os_ios === 'true' ? true : false,
  region: req.body.region,
  status: req.body.status,
  title: req.body.title,
  type: req.body.type
}).then((docRef) => {

  let bufferStream = new stream.PassThrough();
  base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
  bufferStream.end(Buffer.from(base64EncodedImageString, 'base64'));

  var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
  //Pipe the 'bufferStream' into a 'file.createWriteStream' method.
  bufferStream.pipe(file.createWriteStream({
      metadata: {
        contentType: 'image/png',
        metadata: {
          custom: 'metadata'
        }
      },
      public: true,
      validation: "md5"
    }))
    .on('error', function(err) {
      console.log(err);
    })
    .on('finish', function() {
      res.json({
        message: "Feeds Added Successfully",
        feeds: docRef.id
      });
    });
})

};

【问题讨论】:

标签: node.js firebase base64 firebase-storage


【解决方案1】:

问题是,我在 NodeJS 中使用 firebase-admin SDK,我试图在我的代码中公开该文件,以违反我的存储桶的访问规则。因此,我将公共访问密钥设置为 false,并在上传文件时为该文件生成了访问令牌。这解决了这个问题。我在下面包含了我的工作代码。

var stream = require('stream');
const uuidv4 = require('uuid/v4');

const uuid = uuidv4();
let bufferStream = new stream.PassThrough();
var base64EncodedImageString = req.body.imageSrc.replace(/^data:image\/\w+;base64,/, '');
bufferStream.end(new Buffer.from(base64EncodedImageString, 'base64'));
    
var file = storageRef.file('thumbnail/' + req.body.type + '/' + docRef.id + '.png');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
        bufferStream.pipe(file.createWriteStream({
          metadata: {
            contentType: 'image/png',
            metadata :{
              firebaseStorageDownloadTokens: uuid
           }
          },
          public: false,
          validation: 'md5'
        }))
        .on('error', function(err) {
          console.log(err);
        })
        .on('finish', function() {
          res.json({
            message: "Feeds Added Successfully",
            feeds: docRef.id
          });
        });

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2021-07-30
    • 1970-01-01
    • 2020-03-23
    • 2020-10-15
    • 2020-04-10
    • 2022-07-28
    • 2019-07-22
    • 2017-01-11
    相关资源
    最近更新 更多