मैं बसबॉय के साथ फायरबेस पर गुणक छवियों को अपलोड करने के तरीके पर पिछले कुछ दिनों से कठिन समय बिता रहा हूं। मैं 3 अलग-अलग छवियों के साथ 3 फ़ील्ड का उपयोग करना चाहता हूं। इसलिए मैं इसे एक फ़ोल्डर में स्टोर कर सकता हूं। मैं यह भी चाहता हूं कि छवि का क्षेत्र का नाम हो

मुझे एक विषय मिला जिसने मुझे Promise.all और forEach का उपयोग करने में मदद की लेकिन यह मेरे लिए कारगर नहीं रहा

  • सभी फाइलों को एक सरणी में संग्रहीत करना
    var Promise = require('promise');
    const Busboy = require("busboy");
    const fs = require("fs");
    const os = require("os");
    const path = require("path");


    const busboy = new Busboy({ headers: req.headers });
    let imageToAdd = {};
    let imagesToUpload = []
    let newFileName;

    busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
        const imageExtension =  filename.split('.')[filename.split('.').length - 1];
        filename = `${fieldname}.${imageExtension} `
        newFileName = filename
        const filepath = path.join(os.tmpdir(), filename);
        imageToAdd = { file: filepath, type: mimetype };
        file.pipe(fs.createWriteStream(filepath));
        imagesToUpload = [...imagesToUpload, imageToAdd]
    });
  • फाइल एरे पर लूप करें और वादों को एक नए एरे में स्टोर करें
  • फिर रुकिए सारे वादे Promise.all के साथ हल करने के लिए
    busboy.on("finish", () => {
        let promises = []
        imagesToUpload.forEach((imageToBeUploaded) => {
            promises.push(
                admin
                .storage()
                .bucket(`${config.storageBucket}`)
                .upload(imageToBeUploaded.file, {
                    resumable: false,
                    destination: `projectname/${newFileName}`,
                    metadata: {
                        metadata: {
                          contentType: imageToBeUploaded.type,
                        }
                    }
                })          
            )     

        }) 
        Promise.all(promises)
        .then(res => { 
            res.status(200).json({msg: 'Successfully uploaded all images')
        })
        .catch(err => {
            res.status(500).json({error: err.code})
        })
    })
    busboy.end(req.rawBody);
})

मेरे फायरबेस संग्रहण में केवल अंतिम छवि संग्रहीत है।

क्या कोई इसमें मेरी मदद कर सकता है?

धन्यवाद

0
Bibi 23 अप्रैल 2020, 02:50

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड में केवल एक newFileName है, जबकि आपके पास imagesToUpload की एक सरणी है। इसलिए आप उनमें से प्रत्येक छवि को उसी newFileName पर अपलोड कर रहे हैं और जो भी अपलोड अंतिम रूप से पूरा होता है, उसके साथ समाप्त होता है।

आप imagesToUpload की सरणी के साथ मिलान करने के लिए newFileNames की एक सरणी रखना चाहेंगे।

कुछ इस तरह:

const busboy = new Busboy({ headers: req.headers });
let imageToAdd = {};
let imagesToUpload = []
let newFileNames = [];

busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
    const imageExtension =  filename.split('.')[filename.split('.').length - 1];
    filename = `${fieldname}.${imageExtension} `
    const filepath = path.join(os.tmpdir(), filename);
    imageToAdd = { file: filepath, type: mimetype };
    file.pipe(fs.createWriteStream(filepath));

    imagesToUpload.push(imageToAdd);
    newFileNames.push(filename);
});

...

busboy.on("finish", () => {
    let promises = imagesToUpload.map((imageToBeUploaded, index) => {
        admin
        .storage()
        .bucket(`${config.storageBucket}`)
        .upload(imageToBeUploaded.file, {
            resumable: false,
            destination: `projectname/${newFileNames[index]}`,
            metadata: {
                metadata: {
                  contentType: imageToBeUploaded.type,
                }
            }
        })          
    }) 
    Promise.all(promises)
      ...
0
Frank van Puffelen 23 अप्रैल 2020, 05:40