Python / Django терпит неудачу при декодировании файла, закодированного как base64 javascript - PullRequest
0 голосов
/ 21 декабря 2018

Я использую это в ответ на кодирование base64 файла изображения:

  fileToBase64 = (filename, filepath) => {
    return new Promise(resolve => {
      var file = new File([filename], filepath);
      var reader = new FileReader();
      reader.onload = function(event) {
        resolve(event.target.result);
      };
      reader.readAsDataURL(file);
    });
  };

Который вызывается так:

  handleChangeFile = event => {
    const { name, files } = event.target;
    if (files.length) {
      const file = files[0];
      let fields = this.state.fields;
      this.fileToBase64(file).then(result => {
        fields[name].value = result;
      });
      fields[name].isFilled = true;

      this.setState({
        fields: fields
      });
    }
  };

И переменная целых полей публикуетсяк серверу django никаких проблем пока нет.

На конце Python django:

str_encoded = request.data["file"]
str_decoded = base64.b64decode(str_encoded)

Вторая строка возвращает ошибку, binascii.Error: Invalid base64-encoded string: length cannot be 1 more than a multiple of 4.Я гуглил и читал, что это, вероятно, проблема с заполнением, но я не знаю, как ее исправить.

1 Ответ

0 голосов
/ 21 декабря 2018

Вам придется удалить строку base64 из префикса, добавленного javascript.Префикс выглядит так: data:{type};base64,{actual-base64-string-follows}

В php, где у меня возникла та же проблема, я проверял, начинается ли строка с префикса "data:", и я удаляю ее от начала строки до позиции ;(точка с запятой) плюс 8 символов (чтобы поймать последний "; base64,").

Затем вы можете использовать python для декодирования оставшейся строки base64, поскольку теперь она является действительной строкой base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...