4
votes

Impossible de télécharger l'image du tableau d'octets vers Fire-Storage à l'aide des fonctions Firebase

Je ne parviens pas à télécharger un fichier image au format tableau d'octets sur le firestore à l'aide des fonctions cloud. Le code ci-dessous fonctionne bien en local avec app.listen () mais lorsque j'essaie avec la fonction exports , il ne fonctionne pas

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

Quelqu'un peut-il m'aider s'il vous plaît. Merci d'avance


0 commentaires

3 Réponses :


1
votes

Après quelques lectures sur le téléchargement d'images dans le stockage Firebase. J'ai réalisé qu'au lieu de convertir un tableau d'octets en image, nous pouvons directement télécharger un tableau d'octets en utilisant Uint8Array () qui le convertit automatiquement en image et le télécharger dans le stockage Firebase. Voici le code modifié.

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


3 commentaires

Peut-on faire l'inverse? où l'image est stockée dans Firebase Storage et la télécharger sur une image sur une page html?


@ Learn2Code, où pouvez-vous le faire ?? télécharger l'image dans un fichier HITML?


@Jasmine oui, mais le problème était que gmail le bloque.



2
votes

C'est la solution que j'ai trouvée lors de l'importation de fichiers dans Firebase Storage à l'aide des Fonctions Firebase et Google Cloud Pub / Sub .

REMARQUE Pub / Sub est facultatif et ne fonctionnait que pour mon cas d'utilisation

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 commentaires

2
votes

Merci pour vos réponses. J'ai utilisé la même approche mais j'ai deux problèmes. Le premier est que je n'obtiens pas de réponse lorsque la fonction est exécutée alors que l'image est en cours de téléchargement. Et l'autre problème est que je ne peux pas voir l'image après le téléchargement et également sur la page Firebase . J'ai défini le ContentType sur 'image / jpg' .
entrez la description de l'image ici

Voici mon code:

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


2 commentaires

Req.rawBody est-il un byteArray ou base64? S'il s'agit de byteArray, utilisez Unit8array () sinon directement vous pouvez passer req.rawBody comme imageBuffer


Ça marche. Simple et sans erreurs comme réponse ci-dessus. Merci