如何使用Express.js 下载 视频文件
新人 一枚 大四毕业生 正在写一个 视频网站 现在遇到一点问题 google未果后,求助各位; 开发环境: linux ubuntu12.04.01 LTS chrome 49.xx 问题描述: 本人 使用superagent 在前台发送下载的请求 ,向后台发送一个视频的ID 代码
var request = require('superagent');
var errorHandler = require('../../../../middleware/error-handler');
onDownload: function(videoId) {
var url = '/video/download/' + videoId;
request.get(url)
.set('Content-Type', 'application/json')
.use(errorHandler)
.end((err, req) => {
if(err){
console.log(err.message);
}
});
}
server部分 使用 Express 处理逻辑写到了 controller 中
//下载视频
VideoController.prototype.download = (req, res, next) => {
var videoId = req.params.videoId;
videoId = mongoose.Types.ObjectId(videoId);
async.waterfall([
(done) => {
//然后查找用户,更新用户的收藏列表
Video.findOne({
_id: videoId
}, done);
}
], (err, data) => {
if (err) return next(err);
//console.log('download');
//console.log(data.path);
//public/video/All My Love Is For You-少女时代.mp4
//尝试方法1 使用Express自带的 res.download 方法
var file = __dirname + '/../' + data.path;
file = path.resolve(file);
res.download(file);
//结果,未报错 但是并没有下载的反应
//尝试方法2 设置headers
var time = moment.unix(new Date() / 1000).format('YYYY-MM-DD');
var fileName = time + '.mp4';
var file = __dirname + '/../' + data.path;
file = path.resolve(file);
res.setHeader('Content-disposition', 'attachment; filename=' + fileName + '');
res.setHeader('Content-Type', 'video/mpeg4');
res.send(file); 不行 未报错 但是并没有下载的反应
res.sendFile(file); 也不行 未报错 但是并没有下载的反应
res.download(file); 不行 未报错 但是并没有下载的反应
//尝试方法3 在stackoverflow 上看到的
var time = moment.unix(new Date() / 1000).format('YYYY-MM-DD');
var fileName = time + '.mp4';
var file = __dirname + '/../' + data.path;
file = path.resolve(file);
res.setHeader('Content-disposition', 'attachment; filename=' + fileName + '');
res.setHeader('Content-Type', 'video/mp4');
var filestream = fs.createReadStream(file);
filestream.pipe(res);
res.end();
//结果,未报错 但是并没有下载的反应
});
};
请问有人知道问题出在能哪里了么? 或者给点建议 或者提示, 十分感谢。
2 回复
第三种方法最好 From Noder
自问自答吧 问题出在前台 不该用 onclick 出发 ajax 的请求,或许也可以,但是我不懂怎么做。 so, 我将前台到代码 改为
< a href={"video/download/" + this.props.videoPlayInfo._id }> 下载</a>
而不是
<span className="download" >
<i className="fa fa-download" aria-hidden="true"/>
</span>
<span onClick={this.download}>下载</span>
即可