【问题标题】:Python / Django fails at decoding file encoded as base64 by javascriptPython / Django 无法解码由 javascript 编码为 base64 的文件
【发布时间】:2018-12-21 12:57:15
【问题描述】:

我正在使用它来对图像文件进行 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
      });
    }
  };

整个 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。我用谷歌搜索并读到这可能是一个填充问题,但我不知道如何解决它。

【问题讨论】:

  • 确保在 js base64 字符串中的前缀代码在 python 中处理相同的字符串之前被删除。像那样的东西就是问题
  • @NikosM。它以此开头:data:application/octet-stream;base64,/9j/4AAQSkZJR。所以我需要删除最多并包括base64,?
  • 是的,我认为这是问题
  • 也包括斜线
  • @NikosM。和 /9j/?

标签: javascript python django base64


【解决方案1】:

您必须从javascript 添加的前缀中去除base64 字符串。 前缀就像data:{type};base64,{actual-base64-string-follows}

在 php 中,我遇到了同样的问题,我测试了字符串是否以 "data:" 前缀开头,并将它从字符串的开头剥离到 ;(分号)的位置加上 8 个字符(以捕捉最后";base64,")。

然后您可以使用 python 解码剩余的base64 字符串,因为它现在是一个有效的base64 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多