You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript使用FileReader读取多文件时filedata返回空对象问题求助

问题原因
  • 传入Promise.all的数组元素是包含Promise属性的普通对象,而非Promise实例。Promise.all仅会处理数组层级的Promise,不会递归解析对象内部的Promise,导致你拿到的filedata始终是未resolve的Promise对象,JSON序列化后就会显示为空对象{}。
  • 构建数组时未等待异步读取结果返回,直接把Promise实例作为属性值存入对象,自然无法拿到实际的base64文件内容。
修正代码

仅需修改uploadForm函数逻辑即可,完整JS代码如下:

function readFile(file) {
  return new Promise(function(resolve, reject) {
    let fr = new FileReader();
    fr.onload = function() {
      resolve(fr.result);
    };
    fr.onerror = function() {
      reject(fr);
    };
    fr.readAsDataURL(file)
  });
}

// Handle multiple fileuploads
function uploadForm() {
  let files = $('#file')[0].files;
  let filePromises = [];
  if (!files.length) return;
  for (let i = 0; i < files.length; i++) {
    // 每个Promise完成后返回完整的文件对象
    const currentFile = files[i];
    const filePromise = readFile(currentFile).then(dataUrl => {
      return {
        filename: currentFile.name,
        filedata: dataUrl
      }
    });
    filePromises.push(filePromise);
  }
  Promise.all(filePromises).then((values) => {
    console.log(JSON.stringify(values, null, 2));
    // 此处可添加后续业务逻辑
  }).catch(err => {
    console.error('文件读取失败', err);
  });
}

function showMessage(e) {
  $('#progress').html(e);
  $('#file').val('');
}
效果说明

修改后Promise.all会等待所有文件读取完成,最终输出的values数组完全符合你要求的格式,filedata字段会正确携带base64格式的文件内容。

内容的提问来源于stack exchange,提问作者Code Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:54:02