Хобрук: Ваш путь к мастерству в программировании

Node JS / Firebase Admin SDK / Firebase Storage - изображение base64, загруженное в хранилище firebase, не создает предварительный просмотр

Я пытаюсь сохранить изображение base64, полученное из внешнего интерфейса angular, в каталог хранилища 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
      });
    });
})

};


Ответы:


1

Проблема заключалась в том, что я использовал SDK firebase-admin в NodeJS и пытался сделать файл общедоступным в моем коде вопреки правилам доступа к моей корзине хранилища. Поэтому я установил для ключа открытого доступа значение 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
          });
        });
11.05.2021
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...