node 下载服务端文件(要压缩)

我的服务端部署在本地,所以其实是本地去获取本地文件。。。。

用到了个a标签,标签上

<a  href="api/export?path=assets/jobs/16562003-18ae-4325-9b03-809aa2f073a7_2/input/files&amp;versionName=2">
</a>

利用a标签的点击事件
后端最终的代码 ,核心部分就是最后,用流实现的,也没有生成压缩文件(这是最得意的),但是可以下载到tar文件

 const url = new URL('https:/'+ req.url);
  const filePath = path.resolve(__dirname, "./"+ url.searchParams.get('path'));
  const versionName = url.searchParams.get('versionName')? url.searchParams.get('versionName')+'.tar' :'file.tar'
  
  if (!filePath)
  return res.send({
    state: 1,
    message: "Failed to find the path of the version!"
  });

  res.setHeader('Content-type', 'application/octet-stream');
  res.setHeader('Content-Disposition', 'attachment;filename='+versionName);  

  const destFilePath = filePath+'.tar';

 function handleErr(err){
     
     return res.send({
      state: 1,
      message: "Failed to get the version!"
    });
   }


   const tarStream = new compressing.tar.Stream();

tarStream ------------------------// 核心的就这点
    .on('error',handleErr)
    .pipe(res)
    .on('error',handleErr)
    .on('finish',function(){
      console.log("finish")

后端node部分,我第一次写的如下,我的意思是先压缩,用到了comressing这个库,然后传完了之后再删除压缩的文件

router.route("/export").get((req,res) =>{

  const url = new URL('https:/'+ req.url);
  const filePath = path.resolve(__dirname, "./"+ url.searchParams.get('path'));
  const versionName = url.searchParams.get('versionName')? url.searchParams.get('versionName')+'.tar' :'file.tar'
  
  if (!filePath)
  return res.send({
    state: 1,
    message: "Failed to find the path of the version!"
  });

  res.setHeader('Content-type', 'application/octet-stream');
  res.setHeader('Content-Disposition', 'attachment;filename='+versionName);   

  const destFilePath = filePath+'.tar';
  compressing.tar.compressDir(filePath,   destFilePath)
    .then(() => {
      console.log("success")
        var fileStream = fs.createReadStream(destFilePath);

        fileStream.on('data', function (data) {
          res.write(data, 'binary');
        });
        fileStream.on('end', function () {
            res.end();
            fs.unlink(destFilePath,function(err,data){
              if (err)    return console.log(err);
            })
        });
    })
    .catch(err => {
      console.error(err);
    });
}

第二次看到流的写法,又写了一次

 function handleErr(err){
     console.log(err);
     return res.send({
      state: 1,
      message: "Failed to get the version!"
    });
   }

   console.log(filePath)
   console.log(destFilePath)
    const tarStream = new compressing.tar.Stream();

    tarStream.addEntry(filePath);
    tarStream
      .on('error',handleErr)
      .pipe(fs.createWriteStream(destFilePath))
      .on('error',handleErr)
      .on('finish',function(){
        console.log("finish")
        fs.createReadStream(destFilePath)
          .pipe(res)
          .on('error',handleErr)
          .on('finish',function(){
            fs.unlink(destFilePath,handleErr)
          })
         //fs.unlink(destFilePath,handleErr)
      })

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值