当前位置: 首页 > 工具软件 > Eggjs > 使用案例 >

eggjs下载文件

支劲
2023-12-01

最近在写抖音去水印的功能,其中设计到抖音视频下载到手机的功能,也是费了一番的时间。
用的是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);
      });
    });
  }

如果有用欢迎点赞。

 类似资料: