Я пытаюсь загрузить несколько изображений, снятых с моей веб-камеры, в хранилище Firebase
, вот мой код:
Nodejs:
exports.addUserPhoto = (req, res) => {
const BusBoy = require('busboy');
const path = require('path');
const os = require('os');
const fs = require('fs');
const busboy = new BusBoy({ headers: req.headers});
let imageFileName;
let imageToBeUploaded = {};
let deviceID = '';
let name = '';
let imgFileName;
let imageExtension
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
console.log('ok', fieldname, filename, encoding, mimetype);
if (mimetype !== 'image/jpeg' && mimetype !== 'image/png') {
return res.status(400).json({ error: 'Wrong file type submitted' });
}
// my.image.png => ['my', 'image', 'png']
imageExtension = filename.split('.')[filename.split('.').length - 1];
// 32756238461724837.png
imageFileName = `${Math.round(
Math.random() * 1000000000000
).toString()}.jpg`;
const filepath = path.join(os.tmpdir(), imageFileName);
imageToBeUploaded = { filepath, mimetype };
file.pipe(fs.createWriteStream(filepath));
});
busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
if(fieldname == "deviceID")
{
deviceID = val;
}
else if(fieldname == "name")
{
name = val;
}
});
busboy.on('finish', () => {
async function readFiles () {
const [files] = await admin.storage().bucket(config.storageBucket).getFiles({ prefix: `${deviceID}/${name}`});
let imageNum = 1;
let existingImgName;
files.forEach(f => {
existingImgName = Number(f.name.split('/')[f.name.split('/').length - 1].split('.')[0]);
if(imageNum == existingImgName)
{
++imageNum;
}
});
imgFileName = imageNum + '.jpg';
};
readFiles ().then(()=>{
admin.storage().bucket(config.storageBucket).upload(imageToBeUploaded.filepath,{
resumable: false,
destination: `${deviceID}/${name}/${imgFileName}`,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then(() => {
return res.json({message: 'Image uploaded successfully'});
})
.catch(err => {
console.error(err);
return res.status(500).json({error: err.code})
});
})
});
busboy.end(req.rawBody);
};
Реагировать:
uploadToCloud = async() => {
const { numScreenShots, detections, image } = this.state;
for (let i = 0; i < numScreenShots; i++)
{
var block = this.state.imageArray[i].split(";");
var contentType = block[0].split(":")[1];// In this case "image/gif"
var realData = block[1].split(",")[1];// In this case "R0lGODlhPQBEAPeoAJosM...."
// Convert it to a blob to upload
var blob = this.b64toBlob(realData, contentType);
const formData = new FormData();
formData.append('image', blob);
formData.append('deviceID', this.state.deviceID);
formData.append('name', this.state.occupantName);
this.uploadImage(formData);
this.sleep(500);
}
};
uploadImage = (formData) => {
axios({
url: 'https://cors-anywhere.herokuapp.com/https://asia-east2-smartlock-51f22.cloudfunctions.net/api/addUserPhoto',
method: 'POST',
headers: {
'Access-Control-Allow-Origin': 'http://127.0.0.1:3000',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Access-Control-Allow-Methods, Access-Control-Allow-Origin, Origin, Accept, Content-Type',
'Accept': 'application/x-www-form-urlencoded',
'Content-Type':'application/x-www-form-urlencoded'
},
data:formData
})
.then(res => (console.log(res)))
.catch((err) => (console.log(err)));
}
в коде реакции, я беру строки изображений base64 из снимков с веб-камеры, преобразую их в .blob и отправляю в облачное хранилище
в в окне консоли все файлы успешно загружены
![enter image description here](https://i.stack.imgur.com/jQtVe.png)
, однако в моем хранилище Firebase появляется только 10 изображений
![enter image description here](https://i.stack.imgur.com/ks5WD.png)
пожалуйста, сообщите