Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Uploading multiple images and convert them to base64?

I’m trying to create a form where you can upload multiple images using two file inputs, see the images as base64 and later submit them using jQuery’s POST. The problem is that when I select 3 different images, I see only the last one 3 times. I guess the problem is in the for in the addEventListener – maybe it’s not in the right place?

<div class="form-group">
    <label for="product_photo_1">Photos 1</label>
    <div class="custom-file">
        <input type="file" class="custom-file-input" id="product_photo_1" multiple />
        <label class="custom-file-label" for="product_photo_1" data-browse="Select">Please, select a file...</label>
    </div>
    <div id="product_photo_1_result"></div>
</div>
<div class="form-group">
    <label for="product_photo_2">Photos 2</label>
    <div class="custom-file">
        <input type="file" class="custom-file-input" id="product_photo_2" multiple />
        <label class="custom-file-label" for="product_photo_2" data-browse="Select">Please, select a file...</label>
    </div>
    <div id="product_photo_2_result"></div>
</div>
<script>
    const convertBase64 = (file) => {
        return new Promise((resolve, reject) => {
            const fileReader = new FileReader();

            fileReader.readAsDataURL(file);

            fileReader.onload = () => {
                resolve(fileReader.result);
            };

            fileReader.onerror = (error) => {
                reject(error);
            };
        });
    };

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

        const base64 = await convertBase64(file);

        document.getElementById("product_photo_" + id + "_result").innerHTML += '<img src="' + base64 + '" class="img-thumbnail m-2" id="product_photo_' + id + '[]" style="height: 50px;" />';
    };

    document.getElementById("product_photo_1").addEventListener("change", (event) => {
        for(var index = 1; index <= document.getElementById("product_photo_1").files.length; index++) {
            uploadImage(event, 1);
        }
    });

    document.getElementById("product_photo_2").addEventListener("change", (event) => {
        for(var index = 1; index <= document.getElementById("product_photo_2").files.length; index++) {
            uploadImage(event, 2);
        }
    });
</script>

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

In uploadImage function you are passing event argument and select first file every time

const file = event.target.files[0];

Instead you can pass files one by one to the uploadImage.

Here is the example:

<div class="form-group">
  <label for="product_photo_1">Photos 1</label>
  <div class="custom-file">
    <input type="file" class="custom-file-input" id="product_photo_1" multiple />
    <label class="custom-file-label" for="product_photo_1" data-browse="Select">Please, select a file...</label>
  </div>
  <div id="product_photo_1_result"></div>
</div>
<div class="form-group">
  <label for="product_photo_2">Photos 2</label>
  <div class="custom-file">
    <input type="file" class="custom-file-input" id="product_photo_2" multiple />
    <label class="custom-file-label" for="product_photo_2" data-browse="Select">Please, select a file...</label>
  </div>
  <div id="product_photo_2_result"></div>
</div>
<script>
  const convertBase64 = (file) => {
    return new Promise((resolve, reject) => {
      const fileReader = new FileReader();

      fileReader.readAsDataURL(file);

      fileReader.onload = () => {
        resolve(fileReader.result);
      };

      fileReader.onerror = (error) => {
        reject(error);
      };
    });
  };

  const uploadImage = async (file, id) => {
  
    const base64 = await convertBase64(file);

    document.getElementById("product_photo_" + id + "_result").innerHTML += '<img src="' + base64 + '" class="img-thumbnail m-2" id="product_photo_' + id + '[]" style="height: 50px;" />';
  };

  document.getElementById("product_photo_1").addEventListener("change", (event) => {
   let files = document.getElementById("product_photo_1").files;
    for (let index = 0; index <= files.length; index++) {
      uploadImage(files[index], 1);
    }
  });

  document.getElementById("product_photo_2").addEventListener("change", (event) => {
    let files = document.getElementById("product_photo_2").files;
    for (let index = 0; index <= document.getElementById("product_photo_2").files.length; index++) {
      uploadImage(files[index], 2);
    }
  });

</script>
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading