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

Transitioning JPEG-Based to JPEG XL-Based Images for Web Platforms

When the JPEG codec was being developed in the late 1980s, no standardized, lossy image-compression formats existed. JPEG became ready at exactly the right time in 1992, when the World Wide Web and digital cameras were about to become a thing. The introduction of HTML’s <img> tag in 1995 ensured the recognition of JPEG as the web format—at least for photographs. During the 1990s, digital cameras replaced analog ones and, given the limited memory capacities of that era, JPEG became the standard format for photography, especially for consumer-grade cameras.

Read more

Amplify Your Jamstack With Video

By Alex Patterson
Amplify Your Jamstack With Cloudinary Video

As defined by Amazon Web Services (AWS), Amplify is a set of products and tools with which mobile and front-end web developers can build and deploy AWS-powered, secure, and scalable full-stack apps. Also, you can efficiently configure their back ends, connect them to your app with just a few lines of code, and deploy static web apps in only three steps. Historically, because of their performance issues, managing images and videos is a daunting challenge for developers. Even though you can easily load media to an S3 bucket with AWS Amplify, transforming, compressing, and responsively delivering them is labor intensive and time consuming.

Read more
Cloudinary Helps Move James Hardie’s Experience Online

While COVID has affected most businesses, it has been particularly hard on those that sell products for the physical ‘brick and mortar’ world. One company that literally fits that bill is our Australian customer James Hardie, the largest global manufacturer of fibre cement products used in both domestic and commercial construction. These are materials that its buyers ideally want to see up close, in detail. When customers have questions, they expect personal service.

Read more
How to Build an Enhanced Gravatar Service, Part 2

Part 1 of this post defines the capabilities of an enhanced Gravatar service, which I named Clavatar, and describes the following initial steps for building it:

This post, part 2 of the series, explains how to make Clavatar work like Gravatar and to develop Clavatar’s capabilities of enabling requests for various versions of the images related to user accounts.

Read more