DEV Community

Cover image for UPLOAD IMAGES, VIDEOS, AND AUDIO IN REACT JS USING CLOUDINARY.
Agbo, Daniel Onuoha
Agbo, Daniel Onuoha

Posted on • Edited on

UPLOAD IMAGES, VIDEOS, AND AUDIO IN REACT JS USING CLOUDINARY.

In your React app, you may need to upload Images or Videos from your machine, either to send them to a backend API or to just display the uploaded image.

For we will be using Cloudinary, which streamlines media management and improves user experience by automatically delivering images and videos, enhanced and optimized for every user.

We will be uploading the images to Cloudinary and getting them back, it will work as sort of pushing data to an API and fetching the scent data.

Let’s get started.

Go to [https://cloudinary.com](https://cloudinary.com/) and sign up.
Enter your role
Enter fullscreen mode Exit fullscreen mode
  1. Select the project you want to do.

  2. Head over to your dashboard where you will see your cloud Name

  3. We also need to have an upload preset. Go to settings using a small icon on the bottom left of the sidebar.

  4. Under product environment settings, click on upload, scroll down until you see upload presets.

  5. Click on add upload preset.

Image description

  1. You will see a form like this.

  2. The signing mode by default will be signed, CHANGE it to signed and save.

10 . To upload an image or a video, you will need 2 things

Cloud Name
Upload Preset Name
Enter fullscreen mode Exit fullscreen mode

REACT CODE

In react, we shall be handling an on-change function on an input with the type of file.

The code for a file input is as follows

This on the browser looks like this

We will make a function for the onChange event listener for this input file that will post the media file we pick from our local machine, send it to Cloudinary, and send a GET request to our cloud name to get the uploaded media file. This will come back in the form of a string URL which we can store in the state.

We shall have a component called Input.js, here we shall have an empty state for images and videos.

This is the structure of the code for Images.
Enter fullscreen mode Exit fullscreen mode

import React, { useState } from "react";

function Input() {
  const [image, setImage] = useState("");

  const uploadImage = (files) => {
    const formData = new FormData();

    formData.append("file", files[0]);
    formData.append("upload_preset", "<your upload preset>");
    fetch(
      "https://api.cloudinary.com/v1_1/<your cloud name>/image/upload",
      {
        method: "POST",
        body: formData,
      }
    )
      .then((response) => response.json())
      .then((data) => {
        setImage(data.secure_url);
      });
  };
  return <div>
        <input type="file" onChange={(e) => uploadImage(e.target.files)} />
        <img
            src={image}
            alt="uploaded image"
        />
  </div>;
}
export default Input;
Enter fullscreen mode Exit fullscreen mode

in the uploadImage function, on formData.append, add your upload preset name and on the API endpoint you are fetching from add your cloudname .

You will get the image string back and set it in the Image state. You can then display the image by using the img tag and the src as the image state, or you can send this image URL to a backend API.

This is the structure of the code for Videos
Enter fullscreen mode Exit fullscreen mode
import React, { useState } from "react";

function Input() {
  const [video, setVideo] = useState("");
  const uploadVideos = (files) => {
    const formData = new FormData();

    formData.append("file", files[0]);
    formData.append("upload_preset", "<your upload preset>");
    fetch("https://api.cloudinary.com/v1_1/<your cloud name>/video/upload", {
      method: "POST",
      body: formData,
    })
      .then((response) => response.json())
      .then((data) => {
        setImage(data.secure_

url);
      });
  };
  return (
    <div>
      <input type="file" onChange={(e) => uploadVideos(e.target.files)} />

      <video src={video} controls />
    </div>
  );
}

export default Input;
Enter fullscreen mode Exit fullscreen mode

in the uploadVideo function , on formData.append, add your upload preset name and on the API endpoint you are fetching from add your cloudname.

You will get the video string back and set it in the Image state. You can then display the image by using the IMG tag and the src as the image state or you can send this image URL to a backend API.

This is the structure of the code for Audios

import React, { useState } from 'react';

const AudioUpload = () => {
  const [audioUrl, setAudioUrl] = useState(null);

  const handleAudioUpload = async (event) => {
    const file = event.target.files[0];

    if (!file) return; // Handle no file selected case

    const formData = new FormData();
    formData.append('file', file);
    formData.append('upload_preset', 'YOUR_UPLOAD_PRESET'); // Replace with your Cloudinary upload preset

    try {
      const response = await fetch(
        `https://api.cloudinary.com/v1_1/YOUR_CLOUD_NAME/video/upload`, // Specify resource type as 'audio'
        {
          method: 'POST',
          body: formData,
        }
      );

      const data = await response.json();
      setAudioUrl(data.secure_url);
    } catch (error) {
      console.error('Error uploading audio:', error);
      // Handle upload errors gracefully (e.g., display error message to user)
    }
  };

  return (
    <div>
      <input type="file" accept="audio/*" onChange={handleAudioUpload} />
      {audioUrl && (
        <audio controls>
          <source src={audioUrl} type="audio/mpeg" />
        </audio>
      )}
    </div>
  );
};

export default AudioUpload;
Enter fullscreen mode Exit fullscreen mode

Note: Cloudinary treats audio uploads as video assets.

Top comments (2)

Collapse
 
mohamed_mushkir_f1ffd3a8e profile image
Mohamed Mushkir

Clear & clear. Thank you so much...

Collapse
 
andrew-saeed profile image
Andrew Saeed

Awesome guide, mate! Thanks so much!