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
3 Réponses :
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);
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.
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); });
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' .
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); }
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