javascriptnode.jsfile-uploadjquery-forms-pluginmulter

Uploading a file and passing a additional parameter with multer


I am using the jQuery Form Plugin and multer to upload files to my server. This works just fine, but I am trying to pass an additional parameter, which will determine where exactly the file will be saved.

I have following code, which I would like to extend to behave as stated:

HTML

<form id="uploadForm"
      enctype="multipart/form-data"
      action="/files"
      method="post">
    <input type="file" id="userFile" name="userFile"/>
    <input type="text" hidden id="savePath" name="savePath" value="path"/>
</form>

Client JS

uploadForm.submit(function() {
    $(this).ajaxSubmit({

        error: function(xhr) {
            console.log('Error: ' + xhr.status);
        },

        success: function(response) {
            console.log('Success: ' + response);
        }
    });

    return false;
});

Node.js Route

app.post(APIpath + "file",function(req,res){
    var storage = multer.diskStorage({
        destination: absoluteServePath+ "/" + config.filePath,
        filename: function (req, file, cb) {
            cb(null, file.originalname);
        }
    });
    var upload = multer({ storage : storage}).any();

    upload(req,res,function(err) {
        if(err) {
            console.log(err);
            return res.end("Error uploading file.");
        }
        res.end("File has been uploaded");
    });
});

Note: I know I am not checking for mimetypes or sanitizing the user files, but it is mainly secondary for me right now.


Solution

  • The problem is that multer that saves files first, and only then writes to req the remaining part of the form - such as hidden fields.

    Try this:

    app.post(APIpath + "file",function(req,res){
        var storage = multer.diskStorage({
            destination: tmpUploadsPath
        });
        var upload = multer({ storage : storage}).any();
    
        upload(req,res,function(err) {
            if(err) {
                console.log(err);
                return res.end("Error uploading file.");
            } else {
               console.log(req.body);
               req.files.forEach( function(f) {
                 console.log(f);
                 // and move file to final destination...
               });
               res.end("File has been uploaded");
            }
        });
    });