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