当前位置: 首页 > 后端技术 > Node.js

在nodejs中使用archive压缩文件

时间:2023-04-03 12:45:50 Node.js

前言归档是nodejs中一个可以实现跨平台打包的工具。它可以将文件压缩成zip或rar格式。是一个比较好用的第三方模块installnpminstallarchiver--savearchivegithub地址:https://github.com/archiverjs/node-archiverQuickStart//requiremodulesvarfs=require('fs');vararchiver=require('archiver');//创建一个文件将归档数据流式传输到.varoutput=fs.createWriteStream(__dirname+'/example.zip');//设置压缩格式为zipvararchive=archiver('zip',{zlib:{level:9}//设置压缩级别。});//侦听所有要写入的存档数据//只有在涉及文件描述符时才会触发'close'事件output.on('close',function(){console.log(archive.pointer()+'totalbytes');console.log('archiver已经完成并且输出文件描述符已经关闭。');});//这个事件被触发当数据源被耗尽时,无论数据源是什么。//它不是这个库的一部分,而是来自NodeJSStreamAPI。//@see:https://nodejs.org/api/stream.html#stream_event_endoutput.on('end',function(){console.log('Datahasbeendrained');});//明确捕捉这个错误的好习惯archive.on('error',function(err){throwerr;});//将存档数据通过管道传输到文件archive.pipe(output);//从流附加一个文件varfile1=__dirname+'/file1.txt';archive.append(fs.createReadStream(file1),{name:'file1.txt'});//从stringarchive.append('stringcheese!',{name:'file2.txt'});//从缓冲区追加一个文件varbuffer3=Buffer.from('buffit!');archive.append(buffer3,{name:'file3.txt'});//追加一个文件archive.file('file1.txt',{name:'file4.txt'});//追加来自子目录的文件并将其命名为`new-subdir`在archivearchive.directory('subdir/','new-subdir');//从子目录追加文件,将其内容放在archivearchive的根目录.directory('subdir/',false);//从全局追加文件patternarchive.glob('subdir/*.txt');//完成归档追加文件但流必须完成)//'close','end'或'finish'可能会在调用此方法后立即触发,因此请先注册到它们handarchive.finalize();实际使用中可能更多需要打包的源文件一般都是远程文件,比如第三方文件的存放地址。此时需要先将第三方文件下载到本地示例方法中,根据实际需要修改相应的参数即可。functiondownload(files){//下载文件的本地存档地址//examplefiles=[{name:'xxxx.js',url:'https://xx/xx/xxxx.js'}]letdirPath=path.resolve(__dirname,'文件本地存放位置')mkdir(dirPath);lettmps=files.map((item,index)=>{letstream=fs.createWriteStream(path.resolve(dirPath,item.name));returnnewPromise((resolve,reject)=>{try{request(item.url).pipe(stream).on("close",function(err){console.log("文件["+item.name+"]下载完成");resolve({url:path.resolve(dirPath,item.name),名称:item.name})});}catch(e){reject(e||'')}})});rreturnnewPromise((res,rej)=>{Promise.all(tmps).then((result)=>{console.log(result)res(result)}).catch((error)=>{控制台。log(error||'')})})}//创建文件夹目录functionmkdir(dirPath){if(!fs.existsSync(dirPath)){fs.mkdirSync(dirPath);console.log("文件夹创建成功");}else{console.log("文件夹已经存在");}}将下载的文件本地打包成一个zip文件,可以结合快速入门中的API使用//从子目录追加文件,将其内容放在存档的根目录下,错误的);//注意第二个参数false,这个参数表示打包后的文件相对于输出的目录结构,不要写这个参数表示打包后的文件位置按照第一个参数('subdir/')在本地位置。此时下载url推送到前端页面时需要组装成http或https地址