如何将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
相关产品推荐
相关产品推荐

