> ## Documentation Index
> Fetch the complete documentation index at: https://cloudinary.com/documentation/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload multiple files in Node.js (video tutorial)

[githublink]: https://github.com/cloudinary-community/cloudinary-examples/blob/main/examples/node-image-upload/upload-multiple.js

## Overview

Learn how to upload assets in Node.js using the Cloudinary Node.js SDK.

## Video tutorial

  This video is brought to you by Cloudinary's video player - embed your own!Use the controls to set the playback speed, navigate to chapters of interest and select subtitles in your preferred language.

> **TIP**: :title=View the code

You can find the code from this tutorial in [GitHub][githublink].
## Tutorial contents
This tutorial presents the following topics. Click a timestamp to jump to that part of the video.
### Upload one image using the Node.js SDK
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=0 :sec=12 :player=cld} | Once you have [installed and configured the Cloudinary Node.js SDK](node_configuration_tutorial), you can upload an image using the `upload` method of the [Upload API](image_upload_api_reference#upload).  For example,  to upload an image located at `/images/image-1` in your file system:
|

```nodejs
const uploadImages = async () => {
  const result = await cloudinary.uploader.upload("./images/image-1.jpg");
  console.log(result);
}
```

### Run the code and get a response
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=0 :sec=21 :player=cld} | Run the code using `npm run`. The result will contain a secure URL. Copy and paste the URL into your browser to view the uploaded image.
|

### Upload multiple images
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=0 :sec=36 :player=cld} | To upload multiple images, you could create an array containing the file paths of the images you want to upload. Then, iterate through the array and apply the `upload` method to each image.
|

```nodejs
const images = [
  './images/image1.jpg',
  './images/image2.jpg',
  './images/image3.jpg',
  './images/image4.jpg',
  './images/image5.jpg',
  './images/image6.jpg',
  './images/image7.jpg',
  './images/image8.jpg',
  './images/image9.jpg',
  './images/image10.jpg',
];

const uploadImages = async () => {
  for (const image in images){
    const result = await cloudinary.uploader.upload(images[image]);
    console.log(result);
  }
}
```

### Run the code and get a response
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=0 :sec=58 :player=cld} | Run this code using `npm run`. You'll receive a response for each image, including its secure URL.
|

### Install p-limit
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=1 :sec=11 :player=cld} | If you're uploading a large number of images, consider using a different upload method like p-limit. This enables you to concurrently utilize promises while controlling the maximum number of simultaneous executions. Install `p-limit` using `npm install p-limit`.
|

### Set the concurrent promise limit
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=1 :sec=40 :player=cld} | Start by importing p-limit and specify the maximum number of promises that can execute concurrently. In this example, the limit is set to 10 concurrent promises, which fits the limitation for the free plan. For example, if you're uploading 100 images, 10 uploads will process concurrently until all images are uploaded.
|

```node
import pLimit from "p-limit";

const limit = pLimit(10)
```

### Batch upload using p-limit
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=1 :sec=58 :player=cld} | Create a function called `imagesToUpload`, which maps over each image in the `images` array. Within this function, utilize p-limit to enforce the concurrent promise limit set earlier. Inside the limited function, use the `upload` method to upload each image. Specify the current image using `image` from the mapping and return the upload result. Execute the function using `let uploads = await Promise.all(imagesToUpload);` and log the results to the console.
|

```node
const imagesToUpload = images.map((image) => {
  return limit(async () => {
    const result = await cloudinary.uploader.upload(image);
    return result;
  })
});

let uploads = await Promise.all(imagesToUpload);
console.log(uploads);

```

### Run the batch upload
{table:class=tutorial-bullets}|  | 
| --- | --- |
|{videotime:id=media :min=2 :sec=44 :player=cld} | Run the code to initiate the uploads, and get an array containing the outcomes of all the promises.
|

## Keep learning

> **READING**:
>
> * Learn more about [uploading images and videos using the Node.js SDK](node_image_and_video_upload).

> * Take a look at our [Upload guide](upload_images) to learn about uploading to Cloudinary in general.

> * Use the [Upload API reference](image_upload_api_reference) to find all the options and parameters available for the SDK.

> * Watch more [Dev Hints videos](https://www.youtube.com/playlist?list=PL8dVGjLA2oMpaTbvoKCaRNBMQzBUIv7N8) on the [Cloudinary YouTube channel](https://www.youtube.com/cloudinary).

#### If you like this, you might also like...

  
  
  
    Configure the Node.js SDK
    Install and configure the Cloudinary Node.js SDK 
  

  
  
  
    Upload Videos in Node.js
    Upload videos to Cloudinary using the Node.js SDK 
  

  
  
  
    Upload Widget
    Embed an Upload Widget in your site 
  

&nbsp;

&nbsp;Check out the Cloudinary Academy for free self-paced Cloudinary courses on a variety of developer or DAM topics, or register for formal instructor-led courses, either virtual or on-site.
&nbsp;
