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.
source share