如何使用JavaScript在浏览器中读取解码.avro格式UInt8Array容器文件?
浏览器端JavaScript解码Avro容器文件解决方案
首先明确你的理解存在偏差:avro-js和avsc都支持直接传入二进制数据解码,完全不需要依赖Node.js的文件系统API,浏览器端可以正常使用。
方法1:使用avsc解码(更推荐,性能和兼容性更好)
直接将拿到的Uint8Array喂入avsc的块解码器即可,示例代码如下:
// 已经引入avsc库的前提下执行 const resultList = []; // 初始化Avro块解码器 const avroDecoder = new avsc.streams.BlockDecoder(); // 监听数据解析事件,每解析出一条记录就会触发 avroDecoder.on('data', parsedRecord => { resultList.push(parsedRecord); }); // 监听解析完成事件 avroDecoder.on('end', () => { // 这里处理所有解析完成后的逻辑 console.log('Avro文件解析完成,共获取到' + resultList.length + '条记录'); }); // 传入你拿到的Uint8Array二进制数据 avroDecoder.write(yourUint8ArrayVariable); // 通知解码器数据写入完成 avroDecoder.end();
如果是直接通过script标签引入avsc的UMD包,直接使用全局的avsc变量即可,不需要模块化导入。
方法2:使用avro-js解码
需要先把Uint8Array转为Buffer实例,浏览器环境可以引入buffer包的浏览器适配版本实现转换,示例代码如下:
// 已经引入avro-js和buffer适配的前提下执行 const buffer = Buffer.from(yourUint8ArrayVariable); const fileReader = new avro.DataFileReader(buffer); const resultList = []; while (fileReader.hasNext()) { resultList.push(fileReader.next()); } console.log(resultList);
注意事项
- 你提到二进制转字符串后开头有自定义的
buffer from S3 Obj前缀,需要先计算这段前缀对应的字节长度,把前缀裁剪掉之后再将纯Avro格式的二进制内容传入解码器,否则会触发解析报错 - 如果是大体积的Avro文件,可以分批将加载到的Uint8Array片段喂入解码器,不需要等待整个文件全部加载完成再解析,能大幅提升解析效率
- 整个解析过程都在内存中完成,不需要写入本地文件,完全符合浏览器的安全限制
内容的提问来源于stack exchange,提问作者Corrl
相关产品推荐
相关产品推荐

