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

如何将input file选中的文件转换为Blob格式?

你代码运行异常的核心原因是 FileReader的文件读取操作是异步执行的,调用readAsText后程序不会等待读取完成就会继续执行后面的代码,此时fileReader.result还未被赋值,自然返回null。
另外补充:File对象本身就是Blob类的子类,如果你只需要Blob格式的文件对象,不需要经过FileReader读取,直接取选中的文件即可。

场景1:直接获取文件Blob对象

openselect.addEventListener("change", fileSelect, false);
function fileSelect(event) {
  const file = event.target.files[0];
  // 直接赋值即可,File继承自Blob
  const fileBlob = file;
  console.log('文件Blob对象:', fileBlob);
  // 如需读取Blob内容可调用对应异步方法
  fileBlob.text().then(content => {
    console.log('文本文件内容:', content);
  })
}

场景2:获取Blob对应的Base64字符串(常用于图片预览、文件上传等场景)

openselect.addEventListener("change", fileSelect, false);
function fileSelect(event) {
  const file = event.target.files[0];
  const fileReader = new FileReader();
  
  // 读取完成后触发回调
  fileReader.onload = function() {
    // result为Base64格式的文件字符串
    const blobBase64Str = fileReader.result;
    console.log('Blob对应Base64字符串:', blobBase64Str);
  }

  // 以DataURL格式读取文件,直接生成Base64编码
  fileReader.readAsDataURL(file);
}

// 可选辅助方法:Base64字符串转回Blob对象
function base64ToBlob(base64Str) {
  const [prefix, content] = base64Str.split(',');
  const mimeType = prefix.match(/:(.*?);/)[1];
  const decodedContent = atob(content);
  const uint8Array = new Uint8Array(decodedContent.length);
  
  for (let i = 0; i < decodedContent.length; i++) {
    uint8Array[i] = decodedContent.charCodeAt(i);
  }
  
  return new Blob([uint8Array], { type: mimeType });
}

内容的提问来源于stack exchange,提问作者sergey kalinin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:03