Невозможно загрузить изображение байтового массива в хранилище с помощью функций Firebase - PullRequest
0 голосов
/ 15 февраля 2019

Я не могу загрузить файл изображения в формате байтового массива в хранилище с помощью облачных функций.Приведенный ниже код работает нормально на локальном уровне с app.listen () , но когда я пытаюсь использовать функцию exports , она не работает

const functions = require('firebase-functions');
const { Storage } = require('@google-cloud/storage');
const express = require('express');
var app = express();
var fs = require('fs');

// Your Google Cloud Platform project ID
const projectId ='<project-Id>';

// Creates a client
const storage = new Storage({
projectId: projectId,
keyFilename: '<>'
});


const bucket = storage.bucket("<bucket-name>");

// Byte aray to Image 

function saveImage(filename, data) {
console.log("inside saveImage", data.length);
var myBuffer = new Buffer.alloc(data.length);
for (var i = 0; i < data.length; i++) {
    myBuffer[i] = data[i];
}
console.log(myBuffer)
fs.createWriteStream(filename, myBuffer, 'binary', function (err) {
    console.log("inside writeFile");
    if (err) {
        console.log('error inside fs', err);
    } else {
        console.log("The file was saved!");
    }
 });
}

saveImage("image1.png", result);


app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, 
Content-Type, Accept");
next();
});



exports.UploadImage = functions.https.onRequest(app);

Может кто-нибудь помочь, пожалуйстая вышел.Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Это решение, которое я выбрал при загрузке файлов в Firebase Storage с использованием Firebase Functions и Google Cloud Pub / Sub .

ПРИМЕЧАНИЕ Pub / Sub не является обязательным и работает только для моего варианта использования

const functions = require('firebase-functions');
const admin = require('firebase-admin');

function saveImage(filename, data) {
    const bucket = admin.storage().bucket();
    const imageBuffer = new Uint8Array(data);
    const file = bucket.file(`optional_sub_directory/${filename}`, {
        uploadType: {resumable: false}
    });

    file.save(imageBuffer, (err) => {
        if (err) {
            console.error(`Error uploading: ${filename} with message: ${err.message}`);
            return;
        }

        console.log('Uploaded file');
    });
}

exports.helloPubSub = functions.pubsub
    .topic('demo-topic')
    .onPublish(async(message) => {
        /**
         *  Here goes code to extract the file buffer
         */

        const buffer = /** buffer */

        saveImage("stack_overflow.txt", buffer);
    });

0 голосов
/ 09 июля 2019

Спасибо за ваши ответы.Я использовал тот же подход, но у меня есть две проблемы.Во-первых, я не получаю ответ, когда функция запускается, хотя изображение загружается.И другая проблема, я не могу увидеть изображение после загрузки, а также на странице Firebase .Я установил ContentType в 'image / jpg' .
enter image description here

Вот мой код:

const bucket = admin.storage().bucket();

  try {
    const imageBuffer = new Uint8Array(req.rawBody);
    const file = bucket.file(`projects/sample.jpg`);

    file.save(
      imageBuffer,
      { resumable: false, metadata: { contentType: "image/jpg" } },
      err => {
        if (err) {
          throw new Error(err);
        }
        res.send({
          success: true,
          message: "File Successfully Uploaded..."
        });
      }
    );

  } catch (error) {
    throw new Error(error);
  }
0 голосов
/ 18 февраля 2019

После некоторого прочтения изображения загрузите в хранилище firebase.Я понял, что вместо преобразования байтового массива в Image, мы можем напрямую загружать байтовый массив, используя Uint8Array () , который автоматически преобразует его в изображение и загружает в хранилище Firebase.Ниже приведен модифицированный код.

const functions = require('firebase-functions');
const { Storage } = require('@google-cloud/storage');
const express = require('express');
var app = express();

// Your Google Cloud Platform project ID
const projectId ='<project-Id>';

// Creates a client
const storage = new Storage({

    projectId: projectId,
    keyFilename: './servicekey.json'
});


const bucket = storage.bucket("<bucket-name>");

const options = {
    action: 'read',
    expires: '03-17-2025'
};

// storing Byte array

function saveImage(filename, data) {

 var imageBuffer = new Uint8Array(data);
 var file = bucket.file(filename);

 file.save(imageBuffer, {
           metadata: { contentType: 'image/png' },
           }, 
           ((error) => {

           if (error) {
              console.log('error')
           }
        file.getSignedUrl(options)
        .then(results => {
            const url = results[0];
            console.log(`The signed url for ${imageName} is ${url}.`);
        })
 }));

}

saveImage("image1.png", <byte-Array as input>);


app.use(function (req, res, next) {
 res.header("Access-Control-Allow-Origin", "*");
 res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, 
 Content-Type, Accept");
 next();
});



exports.UploadImage = functions.https.onRequest(app);
...