如何使用 yazl 压缩缓冲区?
How to compress a buffer with yazl?
如何通过 yazl compress/decompress 缓冲区?
https://www.npmjs.com/package/yazl
我不想 create/save 一个 zip 文件,只是压缩一个缓冲区并将其转发到另一个服务。任何示例代码都会有所帮助
var yazl = require("yazl");
var buf = fs.readFileSync(__dirname + '/testArchive.txt');
var zipfile = new yazl.ZipFile();
zipfile.addBuffer(buf, "TEMPENTRY");
zipfile.end();
那么此时存档了吗?
那么我如何通过使用 yauzl 来膨胀该缓冲区?
这种功能应该有帮助,手动检索流的数据包,然后将它们连接成一个 Buffer
:
function stream2buffer(readableStream) {
return new Promise((resolve, reject) => {
const chunks = [];
readableStream.on('data', (chunk) => {
chunks.push(chunk);
}).on('end', () => {
resolve(Buffer.concat(chunks));
}).on('error', (err) => {
reject(err);
});
});
}
然后您可以在 yazl.ZipFile.outputStream
上使用它,在另一端由 yauzl.ZipFile.openReadStream
的回调提供的可读流上使用它。
编辑
我的意思更像是在yazl
的outputStream
上使用这个功能,而不是在你要压缩的源文件上。更像这样:
function zipper(mapping) { // mapping is expected to be a Map here
const handler = new yazl.ZipFile(); // yazl = require('yazl');
for (mapItem of mapping) {
if (typeof mapItem[1] === 'string' || mapItem[1] instanceof String) {
handler.addFile(mapItem[1], mapItem[0]);
} else if (mapItem[1] instanceof Buffer) {
handler.addBuffer(mapItem[1], mapItem[0]);
} else if (mapItem[1] instanceof stream.Readable) { // stream = require('stream');
handler.addReadStream(mapItem[1], mapItem[0]);
} else throw new Error('unsupported type');
}
handler.end();
return stream2buffer(handler.outputStream);
}
解压也一样:
function unzipper(buffer) {
return new Promise((resolve, reject) => {
unzippedContents = {};
yauzl.fromBuffer(buffer, {lazyEntries: true}, (err, zip) => { // yauzl = require('yauzl')
if (err) return reject(err);
zip.on('entry', (entry) => {
if (/\/$/.test(entry.fileName)) return zip.readEntry(); // no directories
zip.openReadStream(entry, async (err, rs) => {
try {
if (err) throw err;
unzippedContents[entry.fileName] = await stream2buffer(rs);
} catch (err) {
zip.close();
return reject(err);
}
zip.readEntry();
});
}).on('end', () => {
zip.close();
resolve(unzippedContents);
});
zip.readEntry(); // start the process
});
});
}
如何通过 yazl compress/decompress 缓冲区? https://www.npmjs.com/package/yazl
我不想 create/save 一个 zip 文件,只是压缩一个缓冲区并将其转发到另一个服务。任何示例代码都会有所帮助
var yazl = require("yazl");
var buf = fs.readFileSync(__dirname + '/testArchive.txt');
var zipfile = new yazl.ZipFile();
zipfile.addBuffer(buf, "TEMPENTRY");
zipfile.end();
那么此时存档了吗? 那么我如何通过使用 yauzl 来膨胀该缓冲区?
这种功能应该有帮助,手动检索流的数据包,然后将它们连接成一个 Buffer
:
function stream2buffer(readableStream) {
return new Promise((resolve, reject) => {
const chunks = [];
readableStream.on('data', (chunk) => {
chunks.push(chunk);
}).on('end', () => {
resolve(Buffer.concat(chunks));
}).on('error', (err) => {
reject(err);
});
});
}
然后您可以在 yazl.ZipFile.outputStream
上使用它,在另一端由 yauzl.ZipFile.openReadStream
的回调提供的可读流上使用它。
编辑
我的意思更像是在yazl
的outputStream
上使用这个功能,而不是在你要压缩的源文件上。更像这样:
function zipper(mapping) { // mapping is expected to be a Map here
const handler = new yazl.ZipFile(); // yazl = require('yazl');
for (mapItem of mapping) {
if (typeof mapItem[1] === 'string' || mapItem[1] instanceof String) {
handler.addFile(mapItem[1], mapItem[0]);
} else if (mapItem[1] instanceof Buffer) {
handler.addBuffer(mapItem[1], mapItem[0]);
} else if (mapItem[1] instanceof stream.Readable) { // stream = require('stream');
handler.addReadStream(mapItem[1], mapItem[0]);
} else throw new Error('unsupported type');
}
handler.end();
return stream2buffer(handler.outputStream);
}
解压也一样:
function unzipper(buffer) {
return new Promise((resolve, reject) => {
unzippedContents = {};
yauzl.fromBuffer(buffer, {lazyEntries: true}, (err, zip) => { // yauzl = require('yauzl')
if (err) return reject(err);
zip.on('entry', (entry) => {
if (/\/$/.test(entry.fileName)) return zip.readEntry(); // no directories
zip.openReadStream(entry, async (err, rs) => {
try {
if (err) throw err;
unzippedContents[entry.fileName] = await stream2buffer(rs);
} catch (err) {
zip.close();
return reject(err);
}
zip.readEntry();
});
}).on('end', () => {
zip.close();
resolve(unzippedContents);
});
zip.readEntry(); // start the process
});
});
}