There are some untar libraries, but I cannot get them working.
My idea would be something like
untar(bufferStreamOrFilePath).extractToDirectory("/path", function(err){})
Is something like this available?
There are some untar libraries, but I cannot get them working.
My idea would be something like
untar(bufferStreamOrFilePath).extractToDirectory("/path", function(err){})
Is something like this available?
Just an update on this answer, instead of node-tar
, consider using tar-fs
which yields a significant performance boost, as well as a neater interface.
var tarFile = 'my-other-tarball.tar'; var target = './my-other-directory'; // extracting a directory fs.createReadStream(tarFile).pipe(tar.extract(target));
The tar-stream module is a pretty good one:
var tar = require('tar-stream') var extract = tar.extract(); extract.on('entry', function(header, stream, callback) { // make directories or files depending on the header here... // call callback() when you're done with this entry }); fs.createReadStream("something.tar").pipe(extract) extract.on('finish', function() { console.log('done!') });
A function to extract a base64 encoded tar fully in memory, with the assumption that all the files in the tar are utf-8 encoded text files.
const tar=require('tar'); let Duplex = require('stream').Duplex; function bufferToStream(buffer) { let stream = new Duplex(); stream.push(buffer); stream.push(null); return stream; } module.exports=function(base64EncodedTar){ return new Promise(function(resolve, reject){ const buffer = new Buffer.from(base64EncodedTar, "base64"); let files={}; try{ bufferToStream(buffer).pipe(new tar.Parse()) .on('entry', entry => { let file={ path:entry.path, content:"" }; files[entry.path]=file; entry.on('data', function (tarFileData) { file.content += tarFileData.toString('utf-8'); }); // resolve(entry); }).on('close', function(){ resolve(files); }); } catch(e){ reject(e); } }) };