Menu
- Get Started
- Image & Video APIs overview
- Developer kickstart
- SDK quick starts
- Try it!
- MCP servers and LLM tools (Beta)
- VS Code Extension (Beta)
- Video tutorial library
- Programmatic asset management
- Programmatic upload
- Upload programmatically
- Create upload presets
- Auto upload
- Moderate images with AI
- Use AI to generate image captions
- Upload images in Flutter
- Upload images in Node.js
- Auto-tag images in Node.js
- Upload multiple files in Node.js
- Upload videos in Node.js
- Upload images in Python
- Auto-tag images in Python
- Upload videos in Python
- Upload images in PHP
- Upload images in Go
- Upload assets in a React app
- Upload assets in a Vue.js app
- Drag-and-drop uploads in React
- Upload assets in a Next.js app
- Upload assets with Server Actions
- Upload assets in Svelte
- Upload assets in a SvelteKit app
- Upload assets in a Remix app
- Upload images in Hono
- Use webhooks to remove backgrounds
- Upload images in Laravel
- Interaction with Cloudinary APIs
- Cloudinary SDKs
- Find your credentials
- Configure the JavaScript SDK
- Configure the React SDK
- Configure the Angular SDK
- Configure the Flutter SDK
- Configure Svelte Cloudinary
- Configure the Javascript SDK in Svelte
- Getting started with Cloudinary in Node.js
- Configure the Node.js SDK
- Configure the Python SDK
- Configure the PHP SDK
- Configure the Go SDK
- Configure the Vue.js SDK
- Configure the Next.js SDK
- List images in Next.js
- Lazy load images with Next.js
- Image fallbacks in JavaScript
- Captioning on upload with Node.js
- Delete assets with Node.js
- Manage images in a Django app
- Cloudinary CLI
- Widgets and tools
- Programmatic upload
- Optimization and delivery
- Transformations
- Get started with transformations
- Advanced transformation features
- Text overlay transformations
- Complex transformations
- Named transformations
- Named transformations using TX Builder
- Advanced image components
- Trim videos in Node.js
- Splice videos in Node.js
- Zoompan effect
- Video transformations
- Crop and resize images in React
- Crop and resize videos in React
- Crop and resize images in Python
- Remove backgrounds and add drop shadows
- AI generative fill in Next.js
- Color accessibility in JavaScript
- Transformations for social media
- Dev Hints on YouTube
- Dev Hints en Español
- Cloudinary Café Training Sessions
- Programmatic asset management
- Additional onboarding resources
- Guides
- Cloudinary Image
- Product overview
- Image transformations
- Image transformations overview
- Resizing and cropping
- Placing layers on images
- Effects and enhancements
- Background removal
- Generative AI transformations
- Face-detection based transformations
- Custom focus areas
- Transformation refiners
- Animated images
- Transformations on 3D models
- Conditional transformations
- User-defined variables and arithmetic transformations
- Custom functions
- Image optimization and delivery
- Programmatic image creation
- Product Gallery widget
- Media Editor widget
- Image add-ons
- Cloudinary Video
- Upload
- Asset management
- Account management
- Retail and e-commerce
- User-generated content
- Accessible media
- AI in action
- Native mobile
- Add-ons
- Advanced Facial Attributes Detection
- Amazon Rekognition AI Moderation
- Amazon Rekognition Video Moderation
- Amazon Rekognition Auto Tagging
- Amazon Rekognition Celebrity Detection
- Aspose Document Conversion
- Cloudinary AI Background Removal
- Cloudinary AI Content Analysis
- Cloudinary AI Vision
- Cloudinary Duplicate Image Detection
- Google AI Video Moderation
- Google AI Video Transcription
- Google Auto Tagging
- Google Automatic Video Tagging
- Google Translation
- Imagga Auto Tagging
- Imagga Crop and Scale
- Perception Point Malware Detection
- Microsoft Azure Video Indexer
- OCR Text Detection and Extraction
- Pixelz - Remove the Background
- URL2PNG Website Screenshots
- VIESUSTM Automatic Image Enhancement
- WebPurify Image Moderation
- Cloudinary Image
- References
- SDKs
- Release Notes
Upload multiple files in Node.js (video tutorial)
Last updated: Nov-24-2025
Overview
Learn how to upload assets in Node.js using the Cloudinary Node.js SDK.
On this page:
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.
View the code
You can find the code from this tutorial in GitHub.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
| Jump to this spot in the video 0:12 | Once you have installed and configured the Cloudinary Node.js SDK, you can upload an image using the upload method of the Upload API. For example, to upload an image located at /images/image-1 in your file system: |
Run the code and get a response
| Jump to this spot in the video 0:21 | 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
| Jump to this spot in the video 0:36 | 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. |
Run the code and get a response
| Jump to this spot in the video 0:58 | Run this code using npm run. You'll receive a response for each image, including its secure URL. |
Install p-limit
| Jump to this spot in the video 1:11 | 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
| Jump to this spot in the video 1:40 | 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. |
Batch upload using p-limit
| Jump to this spot in the video 1:58 | 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. |
Run the batch upload
| Jump to this spot in the video 2:44 | Run the code to initiate the uploads, and get an array containing the outcomes of all the promises. |
Keep learning
Related topics
- Learn more about uploading images and videos using the Node.js SDK.
- Take a look at our Upload guide to learn about uploading to Cloudinary in general.
- Use the Upload API reference to find all the options and parameters available for the SDK.
- Watch more Dev Hints videos on the Cloudinary YouTube channel.
If you like this, you might also like...
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.