मैं बसबॉय के साथ फायरबेस पर गुणक छवियों को अपलोड करने के तरीके पर पिछले कुछ दिनों से कठिन समय बिता रहा हूं। मैं 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);
})
मेरे फायरबेस संग्रहण में केवल अंतिम छवि संग्रहीत है।
क्या कोई इसमें मेरी मदद कर सकता है?
धन्यवाद
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)
...
संबंधित सवाल
नए सवाल
node.js
Node.js एक घटना-आधारित, गैर-अवरोधक, अतुल्यकालिक I / O रनटाइम है जो Google के V8 जावास्क्रिप्ट इंजन और libuv लाइब्रेरी का उपयोग करता है। इसका उपयोग उन अनुप्रयोगों को विकसित करने के लिए किया जाता है जो क्लाइंट पर और साथ ही सर्वर साइड पर जावास्क्रिप्ट को चलाने की क्षमता का भारी उपयोग करते हैं और इसलिए कोड के पुन: प्रयोज्य और संदर्भ स्विचिंग की कमी से लाभान्वित होते हैं।