Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / Node.js

Upload Files Or Images To Server Using Node JS

5.00/5 (5 votes)
10 Dec 2016CPOL5 min read 34.2K  
In this post we will see how we can upload files or images to server using Node JS. Here we are going to use Visual Studio for our development and preceding NPM packages for our easy development. express multer body-parser We will briefly explain the use of these packages.

In this post we will see how we can upload files or images to server using Node JS. Here we are going to use Visual Studio for our development and preceding NPM packages for our easy development.

  • express
  • multer
  • body-parser

We will briefly explain the use of these packages. As you all know Node JS is a run time environment built on Chrome’s V8 JavaScript engine for server side and networking application. And it is an open source which supports cross platforms. Node JS applications are written in pure JavaScript. If you are new to Node JS, I strongly recommend you to read my previous posts about Node JS here.

Download source code

Background

Few years back if you need to upload any files or images to server, you were completely depended on server side languages like C# and PHP. Everything is changed after the revolution of Node JS. Here I will show you how to upload the files to server using Node JS, without writing even a single line of server side code. I hope you will like this.

Create a Blank Node JS Web Application

Create a blank Node JS web application.

new_node_js_web_application

new_node_js_web_application

Set Up Dependencies in package.json

To get started, we will set up our dependencies first. To do so, please open your package.json file and paste the preceding code.

{
  "name": "node_js_file_upload",
  "version": "0.0.1",
  "description": "Node_JS_File_Upload",
  "main": "server.js",
  "dependencies": {
    "body-parser": "^1.15.2",
    "express": "^4.14.0",
    "multer": "^1.2.0"
  },
  "author": {
    "name": "Sibeesh"
  }
}

Now, run the NPM install command as follows.

npm install

Once you run the command, you can see that the dependencies are installed in the solution.

npm-packages

npm-packages

Now we can understand what are these dependencies used for.

  • express

As per the Express Team, Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.Express provides a thin layer of fundamental web application features, without obscuring Node.js features that you know and love. You can always learn more about Express Package here

  • multer

Multer is a node.js middleware for handling multipart/form-data, which is primarily used for uploading files. It is written on top of busboy for maximum efficiency. Please read more about multer package here.

Start using our dependencies

You can create the instances of our dependencies as follows.

var Express = require('express');
var multer = require('multer');
var bodyParser = require('body-parser');
var app = Express();
app.use(bodyParser.json());

Then, it is time to create a storage which says where and how the files/images should be saved.

var Storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, "./Images");
    },
    filename: function (req, file, callback) {
        callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
    }
});

Each file contains the following information:

fieldname : Field name specified in the form
originalname : Name of the file on the user’s computer
encoding : Encoding type of the file
mimetype : Mime type of the file
size : Size of the file in bytes
destination : The folder to which the file has been saved
filename : The name of the file within the destination
path : The full path to the uploaded file
buffer : A Buffer of the entire file

Now please create multer object as follows.

var upload = multer({ storage: Storage }).array("imgUploader", 3); //Field name and max count

Here multer accepts the storage we created in our previous step as the parameter. The function

array(fieldname[, maxCount])

accept an array of files, all with the name fieldname.

Now it is time to write our post and get action.

app.get("/", function (req, res) {
    res.sendFile(__dirname + "/index.html");
});

app.post("/api/Upload", function (req, res) {
    upload(req, res, function (err) {
        if (err) {
            return res.end("Something went wrong!");
        }
        return res.end("File uploaded sucessfully!.");
    });
});

Here /api/Upload is the action name we are going to set in out HTML page which we will create soon. And last but not the least, we need to make sure that the app is listening to our particular port, in this case it is port 2000.

app.listen(2000, function (a) {
    console.log("Listening to port 2000");
});

Create HTML page and set up uploading

You can create the page as follows with the references of the jquery-3.1.1.min.js and jquery.form.min.js.

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Upload images to server using Node JS</title>
    <script src="Scripts/jquery-3.1.1.min.js"></script>
    <script src="Scripts/jquery.form.min.js"></script>
    
</head>
<body>
    <form id="frmUploader" enctype="multipart/form-data" action="api/Upload/" method="post">
        <input type="file" name="imgUploader" multiple />
        <input type="submit" name="submit" id="btnSubmit" value="Upload" />
    </form>
</body>
</html>

Please be noted that the ecctype for your form must be multipart/form-data and the action must be same as we set in our API.

Create Ajax submit event

Now it is time to create our ajax event where we are going to call our API.

<script>
        $(document).ready(function () {
            var options = {
                beforeSubmit: showRequest,  // pre-submit callback
                success: showResponse  // post-submit callback
            };

            // bind to the form's submit event
            $('#frmUploader').submit(function () {
                $(this).ajaxSubmit(options);
                // always return false to prevent standard browser submit and page navigation
                return false;
            });
        });

        // pre-submit callback
        function showRequest(formData, jqForm, options) {
            alert('Uploading is starting.');
            return true;
        }

        // post-submit callback
        function showResponse(responseText, statusText, xhr, $form) {
            alert('status: ' + statusText + '\n\nresponseText: \n' + responseText );
        }
    </script>

ajaxSubmit function is part of the plugin jquery.form.min.js, so please make sure that you have included it.

Run your application

Now please run your application. Before running your application, you can always set your script file as your start up file, to set it, please right click on your project and click on properties.

set-start-up-file

set-start-up-file

Now you can open your command prompt, you can manually locate your project in command prompt or you can use the ‘Open command prompt here’ option. To select, please right click on your project and select the option as follows.

open_command_prompt_here_option

open_command_prompt_here_option

Now type node server.js in your command prompt which will make sure that your server is running. And if everything is fine, you can see a window as follows.

node_server_js_output

node_server_js_output

We can run our webpage now as our server is ready, please go to your browser and type the URL as http://localhost:2000. Select few files using the file uploader we have created.

select_fiels_in_file_upload

select_fiels_in_file_upload

If you click submit, you can see we are calling our method action and the files are uploaded.

file_uploaded_successfully_

file_uploaded_successfully_

solution_explorer_window_after_saving_files

solution_explorer_window_after_saving_files

You can always download the source code attached to see the complete code and application. Happy coding!.

See also

Conclusion

Did I miss anything that you may think which is needed? Could you find this post as useful? I hope you liked this article. Please share me your valuable suggestions and feedback.

Your turn. What do you think?

A blog isn’t a blog without comments, but do try to stay on topic. If you have a question unrelated to this post, you’re better off posting it on C# Corner, Code Project, Stack Overflow, Asp.Net Forum instead of commenting here. Tweet or email me a link to your question there and I’ll definitely try to help if I can.

Kindest Regards
Sibeesh Venu

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)