Ant Design Upload上传后怎么拿到文件的base64编码?
我用 Ant Design 的 Upload 组件上传图片,想在上传前把文件转成 base64 用于预览,但不知道怎么在 onChange 里获取到 base64。试过用 FileReader,但总是拿不到结果,控制台还报错。
现在代码大概是这样:
const handleChange = (info) => {
const file = info.file.originFileObj;
const reader = new FileReader();
reader.readAsDataURL(file);
console.log(reader.result); // 这里是 null
};
是不是因为 readAsDataURL 是异步的?那该怎么正确拿到 base64 呢?
原理是这样:FileReader 的 readAsDataURL 方法会启动一个异步操作,等文件读取完成后会触发 onload 事件,你需要在 onload 回调里才能拿到正确的 base64 数据。
正确的写法是这样的:
const handleChange = (info) => {
const file = info.file.originFileObj;
// 先检查一下文件是否存在
if (!file) return;
const reader = new FileReader();
// 关键:读取完成后在 onload 回调里获取结果
reader.onload = (e) => {
// e.target.result 就是 base64 编码
const base64 = e.target.result;
console.log(base64); // 这里才能拿到正确的 base64 字符串
};
// 启动异步读取
reader.readAsDataURL(file);
};
如果你用的是 Ant Design Vue,原理是一样的,只是 info 的结构可能稍有不同:
const handleChange = (info) => {
const file = info.file.originFileObj || info.file;
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
console.log(e.target.result);
};
reader.readAsDataURL(file);
};
另外提醒一下,info.file.originFileObj 是 Uploader 经过处理的 File 对象,如果你想直接用原生的 File,info.fileList 里的对象可能有不同的结构。
还有个常见坑:如果你的预览需要显示 img 标签,直接把 base64 字符串赋值给 src 就行,比如
如果还有其他问题再问。
readAsDataURL确实是异步的。FileReader 读取文件需要时间,你直接在下一行打印reader.result,这时候文件还没读完呢,当然是 null。前端这块处理文件读取,得用回调函数来拿结果。正确写法是在
onload回调里获取:如果你嫌回调写法麻烦,可以封个 Promise 版本,配合 async/await 更舒服:
顺便提醒一下,
originFileObj只有在文件刚选中的时候有值,上传成功后可能就没了,所以要在合适的时机去取。另外大文件转 base64 会很大,小心别把内存撑爆。