You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js通过Fetch实现本地视频链接下载的问题排查

问题分析与修改方案

你的代码存在几个核心问题导致无法实现视频下载:

  • 错误地将视频二进制流尝试解析为JSON格式,这与视频数据的类型完全不匹配
  • 未将获取到的视频流转发给客户端(直接return了JSON结果,没有利用res对象输出响应)
  • 错误设置了Content-Type: application/json请求头,视频下载请求不需要该头信息

以下是修改后的完整代码:

exports.getVideo = async (req, res) => {
    try {
        const path = process.env.APP_LOCALHOST_URL + urlDirectDownloadVideo(req.query);

        const response = await fetch(path, {
            method: 'GET', 
            headers: {
                'Authorization': `Bearer ${req.query.token}`
                // 移除错误的Content-Type: application/json头
            },
        });

        // 检查请求是否成功
        if (!response.ok) {
            throw new Error(`请求失败: ${response.statusText}`);
        }

        // 从原响应获取视频的Content-Type,若获取失败则手动指定为通用视频类型
        const contentType = response.headers.get('Content-Type') || 'video/mp4';
        // 设置响应头,触发浏览器的下载行为
        res.setHeader('Content-Type', contentType);
        res.setHeader('Content-Disposition', 'attachment; filename="video.mp4"');

        // 将fetch获取的二进制流直接转发到客户端响应
        await response.body.pipeTo(res);
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
};

关键改动说明

  • 移除错误请求头:删掉Content-Type: application/json,视频下载请求不需要告知服务器期望JSON格式的数据。
  • 处理二进制流而非JSON:不再使用response.json(),直接操作响应的body(可读流),通过pipeTo将流转发给客户端的res对象。
  • 设置客户端响应头:
    • Content-Type:告知浏览器返回数据为视频类型
    • Content-Disposition: attachment:强制浏览器触发下载弹窗,若需要直接播放视频可改为inline
  • 增加错误处理:用try/catch捕获请求过程中的异常,返回标准的错误响应。

另外需要注意:如果urlDirectDownloadVideo函数生成的查询参数包含特殊字符(比如示例中的password=admin*),要确保函数做了正确的URL编码,避免请求出错。

内容的提问来源于stack exchange,提问作者jhon estrada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:40:28