# How to handle file uploads in Node.js

> Learn how to handle file uploads in Node.js with Express and the express-fileupload middleware, reading the file from req.files and saving it with mv().

Author: Flavio Copes | Published: 2019-10-31 | Updated: 2019-11-12 | Canonical: https://flaviocopes.com/how-to-handle-file-uploads-node/

In [how to upload a file using Fetch](https://flaviocopes.com/how-to-upload-files-fetch/) I explained how to upload a file to a server using [Fetch](https://flaviocopes.com/fetch-api/).

In this post I'm going to show you part 2: how to use [Node.js](https://flaviocopes.com/nodejs/), and in particular [Express](https://flaviocopes.com/express/), to handle uploaded files.

Install the [`express-fileupload`](https://www.npmjs.com/package/express-fileupload) [npm](https://flaviocopes.com/npm/) module:

```sh
npm install express-fileupload
```

and add it to your middleware:

```js
import fileupload from 'express-fileupload'

//or

const fileupload = require('express-fileupload')
```

After you created your Express app, add:

```js
app.use(
  fileupload(),
  //...
```

This is needed because otherwise the server can't parse file uploads.

Now uploaded files are provided in `req.files`. If you forget to add that middleware, `req.files` would be `undefined`.

```js
app.post('/saveImage', (req, res) => {
  const image = req.files.myFile
  const path = __dirname + '/images/' + image.name


  image.mv(path, (error) => {
    if (error) {
      console.error(error)
      res.writeHead(500, {
        'Content-Type': 'application/json'
      })
      res.end(JSON.stringify({ status: 'error', message: error }))
      return
    }

    res.writeHead(200, {
      'Content-Type': 'application/json'
    })
    res.end(JSON.stringify({ status: 'success', path: '/images/' + image.name }))
  })
})
```

This is the smallest amount of code needed to handle files.

We call the `mv` property of the uploaded image. That is provided to us by the `express-fileupload` module. We move it to `path` and then we communicate the success (or an error!) back to the client.
