@accountnujen

Как файлов в formData получить base64?

Я жму submit и начинаю собирать объект. В случае, если это файл, я хочу получить его base64.
for(let [key, value] of formData.entries()) {
    if (key === 'file') {
      if (value.size > 0) {
        cl(getBase64(value));
      }
    } else {
      datar[key] = value;
    }
  }

function getBase64(file) {
  const reader = new FileReader();
  reader.onload = function (event) {
    return event.target.result;
  }
  reader.readAsDataURL(file);
}


где я допускаю ошибку?
  • Вопрос задан
  • 205 просмотров
Решения вопроса 2
szQocks
@szQocks
ошибка в том что ты из функции ничего не возвращаешь, то есть твоя функция getBase64 возвращает undefined
Ответ написан
zkrvndm
@zkrvndm
Архитектор решений
Ну, во первых у тебя ошибка в функции getBase64, а именно там надо возвращать просмис и разрешать его после того, как Blob прочитан, соотвественно это требует времени на работу функции. Вторая твоя проблема, ты пытаешься в синхронном цикле выполнить асинхронную операцию, ожидая что ответ получишь тут же и ты сможешь его записать в переменную, но в случае с промисами это нифига не так.

Для того, чтобы конвертировать File в Base64 синхронно, нужен другой подход. Существует хак, позволяющий с использованием XMLHttpRequest и TextEncoder выполнить конвертацию файла в base64 синхронно, вот пример:
function getBase64(file) {

  var url = URL.createObjectURL(file);

  var request = new XMLHttpRequest();
  request.open('GET', url, false);
  request.send(null);

  var u8a = new TextEncoder().encode(request.responseText);

  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

  var bytes = u8a, i, len = bytes.length, base64 = '';

  for (i = 0; i < len; i += 3) {
    base64 += chars[bytes[i] >> 2];
    base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
    base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
    base64 += chars[bytes[i + 2] & 63];
  }

  if (len % 3 === 2) {
    base64 = base64.substring(0, base64.length - 1) + '=';
  }

  else if (len % 3 === 1) {
    base64 = base64.substring(0, base64.length - 2) + '==';
  }

  return base64;

}

Но должен предупредить, что этот хак будет работать только с текстовыми документами. Различные медиаданные он тупо поломает. Если надо в Base64 перегнать медиа, то надо использовать FileReader и промисы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы