- Get Started
-
Guides
- Cloudinary Image
- 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
- VIESUS™ Automatic Image Enhancement
- WebPurify Image Moderation
- References
- SDKs
- Release Notes
- Get Started
- Image & Video APIs overview
- Developer kickstart
- SDK quick starts
- Try it!
- AI agent tools and MCP servers (Beta)
- VS Code Extension (Beta)
- Video tutorial library
- Programmatic asset management
- Programmatic upload
- Upload programmatically
- Upload with Fetch API
- Create upload presets (Node.js)
- Create upload presets (Console UI)
- 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 Astro
- 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
- Install and configure Laravel 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
- Image gallery with Astro
- Cloudinary CLI
- Widgets and tools
- Programmatic upload
- Optimization and delivery
- Transformations
- Get started with transformations
- Advanced transformation features
- Text overlay transformations
- Add watermarks in JavaScript
- 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 Image troubleshooting and tips
- Troubleshooting image transformation errors
- 404 errors for transformed assets
- Add a solid color overlay
- Images delivered without gzip compression
- Long time to first byte (TTFB) on WebPageTest.org
- Update a named transformation
- Cloudinary vs Imagga cropping
- Placeholder images (LQIP)
- Common error codes in X-Cld-Error header
- How to detect corrupted images
- Force specific image when sharing links on Facebook
- Offset face-detection gravity
- Cloudinary Video
- Product overview
- Cloudinary Video Player
- Video Player features
- Installation and setup
- How to embed the Video Player
- Video Player Studio
- Video Player customization
- Playlists and recommendations
- HLS and MPEG-DASH
- Video Player accessibility
- Video Player advanced features
- Video Player API reference
- Player profiles API reference
- Video config API reference
- Adaptive bitrate streaming
- Video transformations
- Video and audio optimization
- Video transcription
- Video analytics
- Live streaming
- Video add-ons
- Video best practices
- Social media videos
- Troubleshooting and tips
- 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
- VIESUS™ Automatic Image Enhancement
- WebPurify Image Moderation
- Cloudinary Image
- References
- SDKs
- Release Notes
Upload assets in a React app (video tutorial)
Last updated: Feb-25-2026
Overview
Add asset upload capabilities to your React app using the Cloudinary Upload widget. Learn how to install and configure the Upload widget including how to make the widget work with the intricacies of a React application.
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.
Tutorial contents
This tutorial presents the following topics. Click a timestamp to jump to that part of the video.
Introduction to the Upload widget
| Cloudinary has many ways to upload files to your Media Library to take advantage of Cloudinary's extensive features and capabilities. In a React app you can use the Upload widget as a quick and easy way to provide a full upload experience. | |
Add the Upload widget script to your React app
Start with an empty React application and add the Upload widget JavaScript file. Paste the code, which you can find in the Upload widget documentation, into the <head> section of index.html. |
|
Add a new component for the Upload widget
| In your components folder, add a new file called UploadWidget.js in which you can create a component for the Upload widget. You can include the component in your App.js file. | |
Initialize the Upload widget
Use the createUploadWidget method to initialize the widget. Pass in your cloud name (which you can find in the Console Dashboard) and an unsigned upload preset. |
|
Create an upload preset
| In your Cloudinary Console, navigate to Settings > Upload > Upload presets to create a new unsigned upload preset. | |
Create a callback function
| Create a new callback function to handle the response from the Upload widget. | |
Add a button to open the Upload widget
| Return a simple button from the component to open the Upload widget when clicked. | |
Test it out
| Click the button to open the Upload widget and upload a file to your Media Library. You can open the Media Library to see that it successfully uploaded. | |
Take a look at these code examples:
- Using the Upload widget with upload presets in React
- Using the Upload widget for signed uploads in Next.js
- Using the Upload widget with upload presets in Next.js
Keep learning
- Read our Upload widget guide and reference, covering every available parameter option.
- Check out an Upload widget code explorer that you can fork for trying out some sample configuration changes.
- Take a look at our React SDK to learn how to transform your images and videos.
- 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.
✔️ Feedback sent!
Error
Unfortunately there's been an error sending your feedback.

