Uploading multiple files through form from different fields and storing into mongodb databse using express multer

Viewed 999

enter image description hereI am trying to upload two image files a database called cast using multer .I am taking the images as input from a form. I realized that some times it takes files from all the input fields but sometimes it accepts only one image file as input. Can anybody please help me?Thank you in advance

adminUpload.ejs

<html>
    <body>
        <form class="uploadForm" method="post" action="/admin/postFile" enctype="multipart/form-data">
            <label>Enter the name of the actor</label><br>
            <input type="text" name="actor"><br>
            <label class="control-label">Upload the image of the actor</label><br>
            <input name="uplactor" type="file" class="file"><br>
            <label>Enter the name of the actress</label><br>
            <input type="text" name="actress"><br>
            <label class="control-label">Upload the image of the actress</label><br>
            <input name="uplactress" type="file" class="file"><br>
            <input type="submit" value="submit" />
        </form>
    </body>
</html>

AdminRouter.js

const express = require('express')
const router = express.Router()
const controller=require('../Controller/Admin');
const multerFileUpload=require("../Models/Admin")
router.get('/postFile',(req,res)=>{
    res.render('adminUpload.ejs');
    })
var tempupload=multerFileUpload.upload.fields([
    {name: 'uplactor',maxCount: 1},
    {name: 'uplactress',maxCount: 1}])
router.post("/postFile",tempupload,controller.uploadDB)

module.exports=router;

Admin.js

const multer = require('multer');
const storage= multer.diskStorage({
    destination: (req, file, cb) => {
        if (file.fieldname === 'uplactor'||file.fieldname === 'uplactress'||file.fieldname === 'director'||file.fieldname === 'uplSideCharacter') {
            // if uploading cast photo
            cb(null, 'public/cast_images')
          }
        else if(file.fieldname === 'uplTrailer'){
            // else uploading trailer 
            cb(null, 'public/trailers')
          }
        else if(file.fieldname === 'uplMovie'){
            // else uploading movie
            cb(null, 'public/movies')
        }
        else if(file.fieldname === 'uplposter'){
            // else uploading poster
            cb(null, 'public/posters')
          }
        cb(null, 'public/posters');
    },
    filename: (req, file, cb) => {
        cb(null, file.originalname)
    }
});

const fileFilter = (req, file, cb) => {
    if(file.fieldname === 'uplactor'||file.fieldname === 'uplactress'||file.fieldname === 'director'||file.fieldname === 'uplSideCharacter'||file.fieldname === 'uplposter'){
    if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
        return cb(new Error('You can upload only image files!'));
    }
    else{
    cb(null, true);
    }
    }
    if(file.fieldname === 'uplMovie'||file.fieldname === 'uplTrailer'){
    if (!file.originalname.match(/\.(mp4|mp3)$/)) {
        return cb(new Error('You can upload only video files!'));
    }
    else{
    cb(null, true);
    }
    }
};
exports.upload = multer({ storage:storage, fileFilter: fileFilter });

Admin.js(Controller file)

const Cast = require('../Models/Cast');
exports.uploadDB=async (req,res)=>{
    try{
        console.log(req.files)
        console.log(req.files.uplactor[0])
        console.log(req.files.uplactress[0])
    const actor=new Cast({
        name:req.body.actor,
        image:req.files.uplactor[0].filename
    })
    const actress=new Cast({
        name:req.body.actress,
        image:req.files.uplactress[0].filename
    })
    await actor.save();
    await actress.save();
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.send("hello");
     }catch(err){
      res.send(err);
     }
}

app.js

'use strict';
const express = require('express');
const http = require('http');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const AdminRouter = require('./Routes/AdminRoutes');
const mongoose = require('mongoose');
const app=express()
const server = http.createServer(app);
server.listen(3000, 'localhost', () => {
  console.log('server running');
});
app.use(morgan('dev'));
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.set('views', 'views');
app.set('view engine', 'ejs');
app.use('/admin',AdminRouter);
//connection to mongodb
const url = 'mongodb://localhost:27017/Movie';
const connect = mongoose.connect(url, {useNewUrlParser : true, useUnifiedTopology: true  } );
connect.then(() => {
  console.log("Connected correctly to server");
}, (err) => { console.log(err); });

Cast.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const CastSchema = new Schema({
    name: {
        type: String,
        required: true,
        unique: true
    },
    image: {
        type: String,
        required: true
    }
})
const Cast = mongoose.model('Cast', CastSchema)
module.exports= Cast
1 Answers

I have taken your code and debug it.At my end i have used 4 images(2 of them having size in KB and 2 are 9-10 MB) for testing purpose and found that problem exist when either one or both input file of large size(MBs). so,in uploadDB method you've created two instance of Cast model and then save it.to solve your problem create one instance save it and then create second instance and save it.

const actor = new Cast({
            name: req.body.actor,
            image: req.files.uplactor[0].filename
        });
        await actor.save();
        console.log(req.files.uplactress[0]);

        const actress = new Cast({
            name: req.body.actress,
            image: req.files.uplactress[0].filename
        });
        await actress.save();

hope this might help

Output:Output

Related