如何使用Express.js 下载 视频文件
发布于 8 年前 作者 sialvsic 6477 次浏览 来自 问答

新人 一枚 大四毕业生 正在写一个 视频网站 现在遇到一点问题 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>

即可

回到顶部