当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    nodejs中使用archive压缩文件的实现代码

    栏目:win服务器问题汇总 时间:2019-12-06 10:09

    前言

    archive是一款在nodejs中可以实现跨平台打包的工具

    可以将文件压缩为zip或rar格式

    是一个比较好用的第三方模块

    install

    npm install archiver --save

    archive github地址: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');
    //设置压缩格式为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();
    
    

    实际使用

    实际使用中情况可能会比较多

    需要打包的源文件一般为远程文件,比如某一个第三方的文件存放地址,这时则需要先将第三方文件下载到本地

    示例方法,可以根据实际需要修改相应的参数

    function download(files){
      //下载文件的本地存档地址
      //示例 files = [{name: 'xxxx.js',url:'https://xx/xx/xxxx.js'}]
      let dirPath = path.resolve(__dirname, '文件存放的本地位置')
      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("文件[" + item.name + "]下载完毕");
    
            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||'')
      })
    })
    }
    
    //创建文件夹目录
    function mkdir(dirPath) {
      if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath);
        console.log("文件夹创建成功");
      } else {
        console.log("文件夹已存在");
      }
    }