Preface
- archive is a tool for cross platform packaging in nodejs
- You can compress the file to zip or rar format
- It is a better third-party module
install
npm install archiver --save
archive github address: https://github.com/archiverjs/node-archiver
Quick Start
// require modules var fs = require('fs'); var archiver = require('archiver'); // create a file to stream archive data to. var output = fs.createWriteStream(__dirname + '/example.zip'); //Set the compression format to zip var archive = archiver('zip', { zlib: { level: 9 } // Sets the compression level. }); // listen for all archive data to be written // 'close' event is fired only when a file descriptor is involved output.on('close', function() { console.log(archive.pointer() + ' total bytes'); console.log('archiver has been finalized and the output file descriptor has closed.'); }); // This event is fired when the data source is drained no matter what was the data source. // It is not part of this library but rather from the NodeJS Stream API. // @see: https://nodejs.org/api/stream.html#stream_event_end output.on('end', function() { console.log('Data has been drained'); }); // good practice to catch this error explicitly archive.on('error', function(err) { throw err; }); // pipe archive data to the file archive.pipe(output); // append a file from stream var file1 = __dirname + '/file1.txt'; archive.append(fs.createReadStream(file1), { name: 'file1.txt' }); // append a file from string archive.append('string cheese!', { name: 'file2.txt' }); // append a file from buffer var buffer3 = Buffer.from('buff it!'); archive.append(buffer3, { name: 'file3.txt' }); // append a file archive.file('file1.txt', { name: 'file4.txt' }); // append files from a sub-directory and naming it `new-subdir` within the archive archive.directory('subdir/', 'new-subdir'); // append files from a sub-directory, putting its contents at the root of archive archive.directory('subdir/', false); // append files from a glob pattern archive.glob('subdir/*.txt'); // finalize the archive (ie we are done appending files but streams have to finish yet) // 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand archive.finalize();
Actual use
There may be many situations in actual use
-
The source file to be packaged is usually a remote file, such as the file storage address of a third party. In this case, you need to download the third party file to the local first
- The example method can modify the corresponding parameters according to the actual needs
function download(files){ //Local archive address for downloading files //Example files = [{Name: 'XX XX. JS', URL:' HTTPS: / / XX / XX / XXXX. JS'}] let dirPath = path.resolve(__dirname, 'Local location of files') mkdir(dirPath); let tmps = files.map((item,index) => { let stream = fs.createWriteStream(path.resolve(dirPath, item.name)); return new Promise((resolve,reject)=>{ try { request(item.url).pipe(stream).on("close", function (err) { console.log("file[" + item.name + "]Download completed"); resolve({ url: path.resolve(dirPath, item.name), name: item.name }) }); } catch (e) { reject(e||'') } }) }); return new Promise((res,rej)=>{ Promise.all(tmps).then((result) => { console.log(result) res(result) }).catch((error) => { console.log(error||'') }) }) } //Create folder directory function mkdir(dirPath) { if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); console.log("Folder created successfully"); } else { console.log("Folder already exists"); } }
-
Package the downloaded files into a zip file, which can be combined with the api in Quick Start
// append files from a sub-directory, putting its contents at the root of archive archive.directory('subdir/', false); //Note that the second parameter, false, represents the directory structure of the packed file relative to the output, and not writing this parameter represents the directory level according to the first parameter ('subdir / ')
- The location of the packed file is the local location. At this time, the url to be downloaded in the front-end page needs to be assembled into an http or https address