Using archive to compress files in nodejs

Preface

  1. archive is a tool for cross platform packaging in nodejs
  2. You can compress the file to zip or rar format
  3. 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

    1. 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

Keywords: node.js github npm zlib IE

Added by Dustin013 on Tue, 26 Nov 2019 17:48:33 +0200