javascript - FileReader 返回未定义

标签 javascript

我尝试在我的网站中使用 FileReader(),但它在数组中返回未定义。这是我第一次使用 FileReader 从输入文件发送编码数据。我正在使用 Recruiterbox 的 API,正如您在打印中看到的,encoded_data 未定义。我被困在这里,需要一些帮助。 enter image description here

 applyOpening: function applyOpening() {
    let fields = [];
    let formControl = document.querySelectorAll('.form-control');

    for (var i = 0; i < formControl.length; i++) {
      let field = formControl[i];
      let obj = {
        key: field.getAttribute('name')
      }

      if (field.tagName.toLowerCase() === 'input' && field.getAttribute('type') === 'file' ) {
        obj.value = {
          'encoded_data': getBase64(field.files[0]),
          'file_name': field.value
        }
      } else {
        obj.value = field.value
      }
      fields.push(obj);
    }

    function getBase64(file) {
      let reader = new FileReader();

      if (file) {
        return reader.readAsDataURL(file);
      } else {
        return false;
      }
      reader.onloadend = function() {
        return reader.result;
      };
    }

    $.ajax({
      url: 'https://jsapi.recruiterbox.com/v1/openings/' + id + '/apply?client_name=clientname',
      data: JSON.stringify({ fields: fields }),
      dataType: 'json',
      contentType: 'application/json',
      type: 'POST',
      success: function(response) {
        console.log(JSON.stringify(data));
      },
      error: function(er) {
        console.error(er);
      }
    });
  }

更新:

applyOpening: function applyOpening() {

    function getBase64(file) {
      return new Promise(function(resolve) {
        var reader = new FileReader();
        reader.onloadend = function() {
          resolve(reader);
        }
        reader.readAsDataURL(file);
      })
    }

    let fields = [];
    let formControl = document.querySelectorAll('.form-control');

    for (var i = 0; i < formControl.length; i++) {

      let field = formControl[i];

      let obj = {
        key: field.getAttribute('name')
      }

      if (field.tagName.toLowerCase() === 'input' && field.getAttribute('type') === 'file' ) {
        if (field.files[0]) {
          getBase64(field.files[0]).then(function(reader) {
              obj.value = {
                'encoded_data': reader.result,
                'file_name': field.value.replace("C:\\fakepath\\", "")
              };
          });
        }
      } else {
        obj.value = field.value;
      }
      if (obj.key !== null) {
        fields.push(obj);
      }
      console.log(obj);
    }

    app.postApplyOpening(fields);

控制台日志:

console

请求有效负载:

request payload

更新2:

applyOpening: async function applyOpening() {

  function getBase64(file) {
    return new Promise(function(resolve) {
      var reader = new FileReader();
      reader.onloadend = function() {
        resolve(reader);
      }
      reader.readAsDataURL(file);
    })
  }

  let fields = [];
  let formControl = document.querySelectorAll('.form-control');

  for (var i = 0; i < formControl.length; i++) {

  let field = formControl[i];

  let obj = {
    key: field.getAttribute('name')
  }

  if (field.tagName.toLowerCase() === 'input' && field.getAttribute('type') === 'file' ) {
    if (field.files[0]) {
      let reader = await getBase64(field.files[0]);
      obj.value = {
        'encoded_data': reader.result.replace(new RegExp("^data:[A-Z]+/[A-Z]+;base64,", "gi"), ''),
        'file_name': field.value.replace("C:\\fakepath\\", "")
      };
    }
  } else {
    obj.value = field.value;
  }
  if (obj.key !== null) {
    fields.push(obj);
  }
  console.log(obj);
}

app.postApplyOpening(fields);
},

最佳答案

FileReader 异步返回结果。使用 Promise 异步获取结果。您无法返回 readAsDataURL 的结果,即未定义的结果,这就是您所看到的。

请参见此处:Javascript base64 encoding function returns undefined

关于javascript - FileReader 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50477677/

相关文章:

javascript - 如何从 WhatsApp 位置共享中检索位置坐标?

javascript - 用 Canvas 绘制流畅的线条

javascript - 如何添加一个事件监听器,在将某种类型的元素添加到 DOM 时触发?

Javascript 正则表达式值搜索

javascript - 正则表达式模式抛出词法分析器错误 AngularJS

javascript - 如何从数组中获取分类对象的值

javascript - 使用 JQuery 将多个数据属性附加和删除到 URL

javascript - 全局保存数组

javascript - Vue.js 路由器不显示正确的子路由

javascript - 如何将自动扩展添加到 ace 编辑器