React js multiple image upload with preview code example

Example 1: multiple image upload react

class ImageUpload extends React.Component {
  state = {
    files: []
  }

  fileSelectedHandler = (e) => {
    this.setState({ files: [...this.state.files, ...e.target.files] })
  }

  render() {
    return (
      <form>
        <div><h2>Upload images</h2></div>
        <h3>Images</h3>
        <input type="file" multiple onChange={this.fileSelectedHandler} />
      </form>
    )
  }
}


ReactDOM.render(<ImageUpload />, document.getElementById('app'))

Example 2: multiple image upload with preview and delete react js

import React, { Component } from 'react';import { Icon, Button, Image } from "semantic-ui-react";import Compress from "compress.js";// It renders "<" icon, on clicking it gets the earlier photo.const BackArrow = (props) => (  <div onClick={props.previousImage} style={{cursor: "contextMenu", color: "white", fontSize: '2em', marginRight: "-38px", zIndex: 1}}>    <Icon name="angle left" />  </div>);// It renders ">" icon, on clicking it gets the next photo.const NextArrow = (props) => (  <div onClick={props.nextImage} style={{color: "white", fontSize: '2em', marginLeft: "-38px", zIndex: 1}}>    <Icon name="angle right" />  </div>);class ImageUploader extends Component { state = {  pictures: [],          // to store the pictures in base64 format.  slideCount: 0         //to keep track of the photo number }nextImage = () => {  let { slideCount } = this.state;  if(slideCount !== this.state.pictures.length - 1) {   slideCount = slideCount + 1;  }  this.setState({ slideCount }); }previousImage = () => {  let { slideCount } = this.state;  if(slideCount !== 0) {   slideCount = slideCount - 1;  }  this.setState({ slideCount }); }handleImageChange = e => {  e.preventDefault();// Getting multiple images from user's selection  for (var i = 0; i < e.target.files.length; i++) {   let file = e.target.files[i];   // console.log(file);   if(!file.type.includes('image')) {    alert('Please choose image');   } else if(file.size / (1024*1024) > 5) {    alert('Please choose image of smaller size');   }   }  const compress = new Compress();  const files = [...e.target.files];  compress.compress(files, {   size: 4,   quality: 0.75,   maxWidth: 1920,   maxHeight: 1920,   resize: true  }).then(modFiles => {              // modFiles are modified files with exif free and compressed       //  versions of user selected images   let uploadableFiles = [];      for (var i = modFiles.length - 1; i >= 0; i--) {    let file = Compress.convertBase64ToFile(modFiles[i].data, modFiles[i].ext);    let filename = Date.now() + modFiles[i].alt;    let filetype = modFiles[i].ext;    let filelastMod = files[i].lastModified;    uploadableFiles.push(new File([file], filename, {type: filetype, lastModified: filelastMod}));   }    let img = new Image();    let obj;    img.onload = () => {     obj = { width: img.width, height: img.height };     this.setState({ pictures: [ ...this.state.pictures, obj ] });    }    img.src = modFiles[i].prefix + modFiles[i].data;  }); }render() {  const { pictures, slideCount } = this.state;return (   <div>    { pictures.length > 0 ? (      <div>       {pictures.map((photo, key) => {             if (pictures.indexOf(photo) === slideCount) {               return (                 <div style={{display: 'flex', alignItems: 'center', justifyContent: 'center'}}>                  {slideCount !== 0 ? <BackArrow previousImage={this.previousImage}/> : ''}                  <div id="imageid" key={photo.id} style={{margin: '0 auto'}}>           <Image src={photo.src} alt='photo'/>           { pictures.length > 1 && (            <div style={{zIndex: 2}}>             {slideCount+1} of {pictures.length}            </div>           )}                   </div>                   {slideCount !== (pictures.length - 1) ? <NextArrow nextImage={this.nextImage}/> : ''}                   </div>               )              }              return ''          })}       <div style={{ padding: "5px" }}>        <Button          color="grey"          icon="close"          circular          basic          content="clear pictures"          onClick={this.handleClearImages}        />       </div>      </div>     ) : (        <div>        <label htmlFor="upload-photo">  /* An image is shown instead of input type="file" button. When user clicks on it, he can select the images from his gadget. */         <img          alt="upload images"          src={"https://via.placeholder.com/512.png?text=Upload+images"}          />        </label>        <input          style={{ opacity: 0, zIndex: 1 }}         id="upload-photo"         type="file"          multiple={true}          onChange={this.handleImageChange}         />       </div>     )    }   </div>  ); }}export default ImageUploader;