JS读取cpio文件内的一个文件

开发前端Vue组件涉及OTA文件上传的时候,想优先通过读取OTA升级包(cpio)文件的一个描述文件description.json来获取一些参数的信息,这样子不需要跑到后台去解析cpio文件内容了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const cpio = require("cpio-stream");
/**
* 解压获得CPIO升级包内的描述信息
* @param {stream.Readable} file CPIO文件打开之后的Stream
* @param {string} desc_name CPIO内包含描述信息的文件名
* @return {Promise<string>}
*/
module.exports = function(file, desc_name) {
let extract = cpio.extract();
return new Promise((resolve, reject) => {
extract.on("entry", function(header, stream, next) {
// header is the tar header
// stream is the content body (might be an empty stream)
// call next when you are done with this entry
let body = "";
// 读取流文件内容
stream.on("data", function(chunk) {
if (header.name == desc_name) {
body += chunk;
}
});
// 读取流文件结束
stream.on("end", function() {
if (header.name == desc_name) {
resolve(body);
}
next();
});
stream.resume(); // just auto drain the stream
});
extract.on("finish", function() {
reject("all entries already read");
});
file.pipe(extract);
});
};

依赖于cpio-stream,使用yarn安装即可,前端调用的时候需要提供一个stream,正常前端读取文件的是Blob,可能你还需要使用blob-to-stream进行转换。

参考链接:

  1. blob-to-stream
  2. cpio-stream