Преобразование массива введенных файлов в base64 с помощью FileReader

#javascript #html #forms #filereader #fileapi

#javascript #HTML #формы #filereader #fileapi

Вопрос:

У меня есть форма, которая позволяет пользователю вводить несколько файлов. Как только форма отправлена, я получаю список файлов, которые ввел пользователь, а затем конвертирую каждый файл в массиве в base64. У меня возникли проблемы с определением того, как именно выполнить последнюю часть — преобразовать каждый файл в массиве в base64, затем вернуть список. Вот что у меня есть на данный момент:

Написанный мной код не работает, но я думаю, что я на правильном пути (используя функцию map, FileReader и т.д.)

 <form id="sendEmailForm" onsubmit="handleFormSubmit(this)">

    <div class="custom-file">
        <input type="file" class="custom-file-input" id="images_input" name="images_input" multiple required>
        <label class="custom-file-label" for="images_input">Select images...</label>
    </div>

    <button type="submit">Submit</button>

</form>

<script>
    function handleFormSubmit(formObject) {
        // Get array of inputted images
        var images = formObject.images_input.files;
        
        // Somehow (?) iterate over images and return the base64 content of each image
        var base64Images = images.map(function (image) => {
            const fileReader = new FileReader();

            var base64Image = fileReader.onload = (image) => {
                return file.target.result.split(",")[1];
            };

            fileReader.readAsDataURL(image);
            return base64Image;
        });

        // Send base64Images to server
    }
</script>
  

Приветствуются любые рекомендации!

Ответ №1:

Привет, это асинхронная операция. Попробуйте обернуть это в Promise:

 function handleFormSubmit(formObject) {
  // Get array of inputted images
  const images = formObject.images_input.files;

  Promise.all(
    images.map(
      (image) =>
        new Promise((resolve, reject) => {
          const fileReader = new FileReader();

          fileReader.onload = (file) => {
            resolve(file.target.result.split(',')[1]);
          };

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

          fileReader.readAsDataURL(image);
        })
    )
  ).then((base64Images) => {
    // Send base64Images to server
  });
}