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

在Fiber框架中使用c.SendFile()时API被多次调用的问题

问题原因与解决方案

这是浏览器和VLC这类视频播放客户端的正常行为,核心原因是它们会使用**HTTP范围请求(Range Requests)**来分段加载视频,而非一次性请求完整文件:

  • 打开视频链接时,客户端先发送一次请求获取文件元信息(比如大小、编码格式);
  • 之后会分多次发送带Range请求头的请求,每次仅拉取视频的一小段数据,实现流式播放(边看边加载);
  • 你的接口每次收到请求都会执行fmt.Println("called"),因此看起来像是被多次触发。

验证方法

你可以在接口中打印请求的Range头,直观确认分段请求的存在:

app.Get("/video", func(c *fiber.Ctx) error {
    fmt.Println("called, Range:", c.Get("Range"))
    return c.SendFile("./videos/2022/12/17/1a191775-a3ab-427a-932e-ebbb3d2879b1/video-360.mp4")
})

运行后会看到类似bytes=0-、bytes=1024-2047的输出,这就是客户端在请求不同分段的视频数据。

处理说明

Fiber的SendFile方法原生支持范围请求,会自动返回206 Partial Content状态码和对应分段的数据,你的代码功能本身是正常的。如果不想每次请求都打印日志,可以添加判断逻辑,比如仅在非范围请求时打印:

app.Get("/video", func(c *fiber.Ctx) error {
    if c.Get("Range") == "" {
        fmt.Println("called (full metadata request)")
    }
    return c.SendFile("./videos/2022/12/17/1a191775-a3ab-427a-932e-ebbb3d2879b1/video-360.mp4")
})

内容的提问来源于stack exchange,提问作者Esmail Ebrahimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:01:36