eggjs下载文件

最近在写抖音去水印的功能,其中设计到抖音视频下载到手机的功能,也是费了一番的时间。
用的是eggjs框架。
记录一下。
关键代码的实现

const axios = require('axios');
const fs = require('fs');
const path = require('path');
// ..... 省略代码

  /**
   * 下载抖音文件
   */
  async dyDownload() {
    const { ctx, app } = this;
    const rule = {
      url: {
        type: 'website',
        msg: '下载地址不能为空',
      },
    };
    const errors = app.validator.validate(rule, ctx.request.query);
    if (errors) {
      return ctx.helper.lackData(errors, rule);
    }

    try {
      const fileName = `${Date.now()}.mp4`;
      const filePath = await this.downloadFile(
        ctx.request.query.url,
        path.join(__dirname, '../tem'),
        fileName
      );

      ctx.attachment(fileName, {
        fallback: true,
        type: 'attachment', // [string] attachment/inline
      });
      // 文件大小
      const fileSize = fs.statSync(filePath).size;
      ctx.set('Content-Length', fileSize);
      ctx.set('Content-Disposition', `attachment; filename=${fileName}`);
      ctx.body = fs.createReadStream(filePath)
        .on('end', () => {
          // 下载完成后删除文件
          fs.unlinkSync(filePath);
        });
    } catch (err) {
      return ctx.helper.failRes({ msg: err.toString() });
    }
  }

  async downloadFile(url, filePath, name) {
    if (!fs.existsSync(filePath)) {
      fs.mkdirSync(filePath);
    }
    const mypath = path.resolve(filePath, name);
    const writer = fs.createWriteStream(mypath);
    const response = await axios({
      url,
      method: 'GET',
      responseType: 'stream',
    });
    response.data.pipe(writer);
    return new Promise((resolve, reject) => {
      writer.on('finish', () => {
        resolve(mypath);
      });
      writer.on('error', err => {
        reject(err);
      });
    });
  }

如果有用欢迎点赞。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxyGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值