Sankalp
Sankalp

Reputation: 1350

NPM Multer returning no response

I am trying to upload a file using npm multer. The issue is multer is returning no response, not even error. I tried to create the common function for whole application for file upload. I have all (777) permission to my folder as well.

My sample code is.

var uploadFile = require('../../utilities/common').uploadFile;
exports.uploadVehicle    = function (req, res) {
    console.log('\nUploading File');
    console.log(dirPath.vehicleFarm);
    uploadFile(dirPath.vehicleFarm, 'csvFile', function (err) {
        console.log('\tError:');
        console.log(err);
        if (err)
            return res.status(err.status || 400).json({code: err.status || 400, message: err.message || 'Unable to process request.'});
        var data = req.body;
        console.log(data.csvFile);
        res.status(200).json({status: 200, message: 'File saved successfully'});
    });
};

The uploadFile function in common file is mentioned like this.

var multer         = require('multer');
var path           = require('path');
var fs             = require('fs');
var filePath       = path.resolve(__dirname, '..');
var storage        = function (inputDir, fieldName) {
    console.log('Input from storage to path - ' + inputDir);
    console.log(filePath + '/uploads/' + inputDir);
    return multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, filePath + '/uploads/' + inputDir);
        },
        filename   : function (req, file, cb) {
            var dateTimeStamp   = Date.now();
            req.body[fieldName] = file.fieldname + '-' + dateTimeStamp + '.' + file.originalname.split('.')[file.originalname.split('.').length - 1];
            console.log(req.body[fieldName]);
            cb(null, req.body[fieldName]);
        }
    });
};
exports.uploadFile = function (inputDir, fieldName) {
    return multer({storage: storage(inputDir, fieldName)}).single(fieldName);
};

Input path is also valid even the folder also exists Path is - /home/sony/Desktop/node/all/db/uploads/tempCSV/vehicleFarm/

Where I have mistaken? How would I trace if file uploads fails as well?

Upvotes: 0

Views: 2312

Answers (2)

Sankalp
Sankalp

Reputation: 1350

Since with target to create single function with dynamic parameters for directory and filename. Here the issue is resolved.

var dirPath                  = require('./directory-path').dirPath;
var multer                   = require('multer');
var path                     = require('path');
var fs                       = require('fs');
var filePath                 = path.resolve(__dirname, '..');
exports.uploadFileToPath     = function (directory, fieldName) {
    this.uploadFile = multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                console.log('In Destination - ');
                cb(null, filePath + '/uploads/' + directory);
            },
            filename   : function (req, file, cb) {
                var dateTimeStamp   = Date.now();
                req.body[fieldName] = file.fieldname + '-' + dateTimeStamp + '.' + file.originalname.split('.')[file.originalname.split('.').length - 1];
                console.log(req.body[fieldName]);
                cb(null, req.body[fieldName]);
            }
        })
    }).single(fieldName);
};

Where I need to call this function, I instantiated it like

var common     = require('../../utilities/common');

var uploadVehicle = new common.uploadFileToPath(dirPath.vehicleFarm, 'csvFile');
uploadVehicle.uploadFile(req, res, function (err) {
    if (err) {
        console.log('\tError:');
        console.log(err);
        return res.status(err.status || 400).json({code: err.status || 400, message: err.message || 'Unable to process request.'});
    }
    var data = req.body;
    console.log('File Name --- ' + data.csvFile);
    //if (data.length === 0)
    //  return callback({status: 400, message: 'Bad request. No record found.'});
    res.status(200).json({status: 200, message: 'File saved successfully'});
});

Now its properly returning response in error case also. Files are uploading to dynamic path passed in params.

Upvotes: 1

Tom
Tom

Reputation: 1411

@Sankalp, I checked the code and made it work, but not with all logic to format the filename (please, do re-implement that later).

As you did not include here the code from the form you are submitting, I think its important to say it must have the enctype="multipart/form-data" in it, otherwise it doesn't work.

Also, the input with type="file" must have the id and name attributes with value as the one passed for the .single() function in NodeJS code. It works as an identifier, so it's better not be dynamic (or you will have to dynamically set it in your HTML too).

The NodeJS code is very straight forward and I think there's no problem with it.

The resulted working code is here:

HTML

<form method="POST" action="file" enctype="multipart/form-data">
    <input type='file' id='csv_file' name='csv_file' value='Choose file' />
    <br>
    <input type='submit' value='Save' />
</form>

NodeJS (I've used Express to test it)

var storageFile = multer.diskStorage({
    destination: function (req, file, cb) {
        var even = Date.now() % 2;
        if (even == 0) {
            console.log("Save in dir_a");
            callback(null, 'files/dir_a');
        } else {
            console.log("Save in dir_b");
            callback(null, 'files/dir_b');
        }
    },
    filename: function (req, file, cb) {
        console.log('Setting the filename.');
        var filename = "File_" + Date.now().toString().substring(0, 11) + ".csv";
        cb(null, filename);
    }
});

var uploadFile = multer({storage: storageFile }).single('csv_file');

app.post('/file', function(req, res) {
    console.log('-------------------------------------------');
    console.log('>>> POST - Submitted page: ' + req.url + ' <<<');
    console.log('-------------------------------------------');

    uploadFile(req, res, function(err) {
        if (err) {
            res.send('<h1>Error to upload file ' + err + '</h1>');
        } else {
            res.send('<h1>File ' + req.file.filename + ' successfully uploaded</h1>');
        }
    });
});

Hope it helps.

Upvotes: 0

Related Questions