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

使用Node.js打包下载文件

时间:2023-04-03 19:14:41 Node.js

本文介绍使用Node.js的fs模块制作zip文件,需要使用archiver包。后端创建归档文件的操作一般由前端发起,如下图:选择的文件地址发送给后端,后端根据文件地址创建归档文件,最后将归档文件的地址返回给前端完成下载。//zip文件临时目录constZIP_TEMPORARY=path.resolve(__dirname,'../../static/zip');/***filearchive*@paramopts其中opts.targets是所选文件类型的地址:Array*/m.zip=(opts)=>{returnnewPromise((resolve,reject)=>{if(!opts.targets||opts.targets?.length===0){reject({成功:false,msg:'参数错误'});}constfile_name=`/${newDate().getTime()}.zip`;constoutput=fs.createWriteStream(ZIP_TEMPORARY+file_name);constarchive=archiver('zip',{zlib:{level:9},//设置压缩级别。});//当所有文件打包完成时触发该事件output.on('close',()=>{console.log(`${archive.pointer()}totalbytes`);console.log('archiver已经完成,输出文件描述符已经关闭。');resolve({success:true,hash:m.encode(ZIP_TEMPORARY+file_name),});});output.on('end',()=>{console.log('Datahasbeendrained');});//捕捉这个的好习惯显式错误archive.on('error',(err)=>{throwerr;});//将文件以管道形式输出到ziparchive.pipe(output);//archive.directory这个方法比较重要,它的作用是把子文件夹下的所有文件也打包。opts.targets.forEach(async(item)=>{constinfo=fs.lstatSync(item);if(info.isDirectory()){archive.directory(item,item.split('/').pop(),null);}else{archive.file(item,{name:item.split('/').pop()});}});档案。finalize().then();});};这样,程序执行后,就可以在指定目录下生成一个以时间戳命名的.zip文件。给前端:resolve({success:true,hash:m.encode(ZIP_TEMPORARY+file_name),});当然你也可以直接把这里的文件发给前端下载,但是这样会让打包程序看起来不够纯粹。我的做法是单独写一个下载的接口,前端可以调用。下篇文章会讲到下载前端可能遇到的问题。Content-Disposition:附件没有触发浏览器下载弹出窗口