Node.js jszip library to extract

I am writing node code and using jszip to zip and unzip some files. I know how to make zip, but I can't figure out how to unzip or unzip. There are several stackoverflow links that do not work. Anyone have a solution? Here is what I tried

var fs = require('fs'); var JSZip = require('jszip'); var zipName = "C:/test.zip"; var unzip = "C:/unzip"; fs.readFile(zipName, function (err, data) { if (err) throw err; var zip = new JSZip(); zip.folder(unzip).load(data); }); 
+6
source share
2 answers

JSZip has no method of writing files to disk. To do this, you need to iterate over zip.files :

 var path = require("path"); Object.keys(zip.files).forEach(function(filename) { var content = zip.files[filename].asNodeBuffer(); var dest = path.join(unzip, filename); fs.writeFileSync(dest, content); } 

Inside the zip file, the folders are represented with a slash '/', I think path.join() will create the correct path, but I cannot verify this.

+8
source

This was probably due to the incorrect implementation of asNodeBuffer and my lack of experience with JS, but I continued to extract the files incorrectly. I wanted to share what ultimately works for me, I tested it with a 250+ MB file.

 ... fs.readFile(tmpFilePath, function (err, data) { if (err) { throw err; } logger.debug('[method] Before extracting file...'); JSZip.loadAsync(data).then(function (zip) { var files = Object.keys(zip.files); logger.debug('[method] files to be created ' + files.length); // in my case, the folders where not being created while "inflating" the content. created the folders in a separated loop // O(n) for those geeks on complexity. createDirectories(files); createFiles(files, zip, someOtherFunctionReference); }).catch(function (err) { deferred.reject(err); }); }); ... /** * Sync opperation to create the folders required for the files. * @param files */ function createDirectories(files) { files.forEach(function (filename) { var dest = path.join(folderName, filename); ensureDirectoryExistence(dest); }); } /** * recursive create directory function * @param filePath * @returns {boolean} */ function ensureDirectoryExistence(filePath) { var dirname = path.dirname(filePath); if (fs.existsSync(dirname)) { return true; } ensureDirectoryExistence(dirname); fs.mkdirSync(dirname); } /** * Create files sync or blocking * @param files * @param zip * @param cb */ function createFiles(files, zip, cb) { try { var countFilesCreated = 0; files.forEach(function (filename) { var dest = path.join(folderName, filename); // skip directories listed if (dest.charAt(dest.length - 1) === '/') { countFilesCreated++; return; } return zip.file(filename).async('nodebuffer').then(function(content){ // var content = zip.files[filename].nodeStream(); fs.writeFileSync(dest, content); countFilesCreated++; // proably someone with more experience in JS can implement a promice like solution. // I thought that in here instead of the counter we coud use an indexOf to return an error in case not all the elements where created correctly. // but if a file throw an error, its handled by the catch ... if (countFilesCreated >= files.length) { logger.debug('All files created!!'); cb(); } }); }); } catch (err) { throw err; } } 

Hope this helps.

0
source

Source: https://habr.com/ru/post/983766/


All Articles