nodejs中使用archive壓縮文件

前言

  1. archive是一款在nodejs中能夠實現跨平臺打包的工具
  2. 能夠將文件壓縮爲zip或rar格式
  3. 是一個比較好用的第三方模塊

install

npm install archiver --save

archive github地址:https://github.com/archiverjs/node-archiverhtml

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();

實際使用

實際使用中狀況可能會比較多前端

  • 須要打包的源文件通常爲遠程文件,好比某一個第三方的文件存放地址,這時則須要先將第三方文件下載到本地node

    1. 示例方法,能夠根據實際須要修改相應的參數
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("文件夾已存在");
    }
}
  • 將下載到本地的文件打包爲一個zip文件,能夠參照 Quick Start 中的api組合使用git

    // append files from a sub-directory, putting its contents at the root of archive
      archive.directory('subdir/', false);
      //要注意第二個參數false,這個參數表明打包後的文件相對於output的目錄結構,不寫這個參數表明按照第一個參數('subdir/')的目錄層級
  • 打包以後的文件位置是在本地位置,此時在推送到前端頁面中下載url須要組裝成http或https的地址
相關文章
相關標籤/搜索