Beego中需在Controller方法开头调用ParseMultipartForm()解析multipart/form-data请求,否则GetFile()返回nil;接着用GetFile()获取文件句柄,SaveToFile()保存到本地。

Beego 中如何接收上传的视频文件并保存到本地
Beego 默认不自动解析 multipart/form-data 类型的请求体,必须显式调用 ParseForm() 或 ParseMultipartForm() 才能读取文件字段。否则 GetFile() 会返回 nil,且无明确错误提示。
- 在 Controller 方法开头立即调用
this.ParseMultipartForm(32 (32MB 是推荐上限,避免内存溢出) - 使用
file, header, err := this.GetFile("video")获取文件句柄,其中"video"必须与 HTML 表单中的name属性一致 - 保存路径建议用绝对路径,避免相对路径在不同工作目录下失效;可用
beego.AppConfig.String("uploadpath")从配置读取 - 务必检查
err和file是否为nil,常见错误是前端未设enctype="multipart/form-data",此时GetFile()永远返回nil
用 FFmpeg 命令行转码时如何避免阻塞 Beego 请求线程
直接在 HTTP 处理函数里用 exec.Command().Run() 同步执行 FFmpeg,会导致整个 Goroutine 阻塞,服务无法响应其他请求。必须异步处理,并提供状态查询接口。
- 用
exec.Command().Start()启动子进程,再用Wait()在 goroutine 中监听完成,避免阻塞主线程 - 转码任务需生成唯一 ID(如
uuid.NewV4().String()),并将输入/输出路径、状态("pending"/"success"/"failed")、错误信息存入内存 map 或 Redis - 不要在转码过程中写死超时时间——某些高清视频可能耗时数分钟,应由客户端轮询
/api/transcode/status?task_id=xxx获取进度 - FFmpeg 命令建议加
-y -v quiet -stats减少日志干扰,关键参数如-c:v libx264 -preset fast -crf 23 -c:a aac要提前验证兼容性
Beego 日志里看不到 FFmpeg 的 stderr 输出怎么办
默认 exec.Command 的 Stderr 是空管道,错误信息被丢弃,导致转码失败时只看到 “exit status 1”,无法定位问题。
- 必须显式设置
cmd.Stderr = &bytes.Buffer{},并在Wait()后读取其内容 - 更稳妥的做法是重定向到文件:
cmd.Stderr = os.OpenFile("/var/log/beego-ffmpeg.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - 注意权限:Beego 进程运行用户(如
www-data)必须对 FFmpeg 可执行文件和输出目录有读写权限,否则报错fork/exec /usr/bin/ffmpeg: permission denied - macOS 上若用 Homebrew 安装 FFmpeg,路径通常是
/opt/homebrew/bin/ffmpeg,别硬编码/usr/bin/ffmpeg
如何让 Beego 正确返回 .mp4 文件供 HTML5
直接用 this.Ctx.ServeFile() 返回 MP4 文件,但浏览器可能无法拖动进度条或显示时长——根本原因是缺少 Accept-Ranges: bytes 和正确的 Content-Type。
- 不要用
ServeFile(),改用http.ServeContent()手动控制响应头,支持分块请求(byte range) - 必须设置
this.Ctx.Output.Header("Content-Type", "video/mp4"),否则 iOS Safari 拒绝播放 - 确保文件系统支持
stat()获取修改时间和大小,否则http.ServeContent会退化为全量传输 - CDN 或反向代理(如 Nginx)可能覆盖
Accept-Ranges头,需额外配置add_header Accept-Ranges bytes;
Beego 本身不内置流式处理或后台任务调度,视频转码这类长耗时操作必须脱离 HTTP 生命周期管理。最容易被忽略的是 FFmpeg 进程的生命周期绑定——没做信号转发的话,Beego 进程重启会导致所有正在转码的 FFmpeg 成为孤儿进程,持续占用 CPU 和磁盘 IO。











