Cloudinary Blog

Node.js File Upload to a Local Server Or to the Cloud

Node.js File Upload to a Local Server Or to the Cloud

Probably one of the best things to happen to JavaScript developers, Node.js empowers them to write and ship JavaScript on the back end. Thanks to Node.js, front-end developers can become full-stack developers in a snap.

The procedures below describe how to Node.js file upload's to your local server or to the cloud at Cloudinary.

How to Optimize for Page Load Speed

Set Up a Node Project

First, download and install Node.js on your system. Afterwards, set up a Node.js back-end server with a package, such as Express. Do the following:

  1. Create an upload directory and run npm init there to generate a package.json file:

    Copy to clipboard
    npm init
  2. In the same directory, install Express:

    Copy to clipboard
    npm install express --save
  3. Create an index.js file with the code below:

    Copy to clipboard
    const express = require('express')
    const app = express()
    const port = 3000
    
    app.get('/', (req, res) => res.json({ message: 'Hello World!' }))
    
    app.listen(port, () => console.log(`This is the beginning of the Node File Upload App`))
  4. Run the project with the command node index.js.

    Your back-end server is now up and running.

    upload

    Afterwards, multer creates an images directory in which to display the details of the recently uploaded file in your console. See this example:

    node upload

    For simultaneous multiple file uploads, just change fileUpload.single to fileUpload.array:

Copy to clipboard
...
app.post('/photos/upload', fileUpload.array('image', 5), function (req, res, next) {
      console.log("Images ", req.file);  
})

5 above can be any numeric value, denoting the number of files you plan to upload.

Step 2: Set up file uploads to Cloudinary

Completing step 1 enables you to upload files to your local server. For multiple files, best store them in a central location like Cloudinary and behind a content delivery network (CDN) at scale for efficient retrieval and delivery to users.

This step establishes the mechanics for uploading files to Cloudinary.

As a prerequisite, sign up for a free account on Cloudinary. Note your cloud name and API keys on the dashboard.

media library

Now do the following.

  1. Rewrite multer to accept zero arguments:

    Copy to clipboard
    const fileUpload = multer()

    Instead of being written to a local directory, the uploaded files now reside in memory temporarily as a buffer.

  2. Install Cloudinary’s Node.js SDK and the streamifier library:

    Copy to clipboard
    npm install cloudinary 
    npm install streamifier
  3. Make the cloudinary and streamifier required libraries in your codebase:

    Copy to clipboard
    ...
    const cloudinary = require('cloudinary').v2
    const streamifier = require('streamifier')
    ...
  4. Rewrite the /upload endpoint code to upload files to Cloudinary:

    Copy to clipboard
    app.post('/upload', fileUpload.single('image'), function (req, res, next) {
    let streamUpload = (req) => {
        return new Promise((resolve, reject) => {
            let stream = cloudinary.uploader.upload_stream(
              (error, result) => {
                if (result) {
                  resolve(result);
                } else {
                  reject(error);
                }
              }
            );
    
           streamifier.createReadStream(req.file.buffer).pipe(stream);
        });
    };
    
    async function upload(req) {
        let result = await streamUpload(req);
        console.log(result);
    }
    
    upload(req);
    });

Recall that you rewrote multer earlier to process and store uploaded files temporarily as a buffer. streamifier now converts the uploaded buffer to a readable stream, after which Cloudinary’s upload_stream method streams directly to the cloud.

The returned result looks like this, complete with the details on the recently uploaded file:

node.js index

Now you can fetch the URL from the JSON response and store it in the database. Mission accomplished.

A Word About Cloudinary’s Node.js SDK

Besides uploading images and videos, Cloudinary’s Node.js SDK can also transform, optimizatize, and deliver them. You can seamlessly integrate those capabilities with your Node.js app. For details, see the related documentation.

Want to Learn More About File Uploads?

Recent Blog Posts

How to Apply Riveting Image Effects in Nuxt Applications With Cloudinary

Nowadays, no way can we build modern apps for the web without considering visuals, which are one of the most efficient ways of communicating online. However, improvements in image quality over the years have exacted a price in larger files, slowing down page loads, especially in low-bandwidth regions or on mobile devices. To resolve that conundrum, turn to Cloudinary, a platform that offers the infrastructure for managing images in web apps. Additionally, Cloudinary’s reliable APIs serve visuals through multiple, fast content delivery networks (CDNs).

Read more
The Pros and Cons of AVIF for Websites

AVIF is a 2019 spinoff from the AV1 video format developed by the Alliance for Open Media (AOM), whose members include Amazon, Apple, ARM, Facebook, Google, Huawei, Mozilla, Microsoft, Netflix, and Intel. As an open-source and royalty-free video codec, AVIF delivers much higher compression rates than the older image codecs like JPEG and WebP, and is on par with the brand-new JPEG-XL format, which does not work on any browser yet.

Read more
Get Your Media Moving Faster with Cloudinary’s Media Optimizer

So, your boss comes to you in a panic: he's just heard about Google's Core Web Vitals initiative and needs you to optimize the company website right now! "No problem," you say, hiding your fear that it's not something that can be done overnight. Just taking the first metric, Largest Contentful Paint (LCP), how can you possibly identify all the large elements - most likely images or video posters - of the many hundreds of pages that make up your site? There are already thousands of high-resolution (read massive) media files stored away, which marketing could use any time. How are you going to make sure they're all compressed to a size small enough to be delivered within the threshold? Not to mention all the new images and videos that will be created over time...

Read more