体育直播系统短视频上传流程:七牛云对接的实现思路和核心代码示例

简介: 东莞梦幻网络科技体育直播系统实现短视频上传功能,基于ThinkPHP+MySQL+Redis+七牛云架构。流程包括前端获取上传凭证、客户端上传视频至七牛云、七牛回调服务器验证签名并入库,涵盖上传策略、回调验证与存储路径规范。核心代码展示如何生成上传Token、前端上传及回调处理,确保安全高效上传。

“东莞梦幻网络科技”体育直播系统的短视频上传流程,与七牛云对接的实现思路和核心代码示例,包括上传签名、回调验证和存储路径规范。使用 ThinkPHP + MySQL + Redis + 七牛云架构。


一、上传流程概览

短视频上传涉及三步:前端拿到上传凭证 → 客户端上传视频 → 七牛云回调服务器确认入库。

流程图示意:

  1. 前端请求上传凭证

    • 前端调用接口(/api/video/getUploadToken)
    • 后端生成七牛上传凭证(UploadToken),并返回给前端
    • Token 包含上传策略、过期时间、回调 URL 等信息
  2. 客户端上传视频到七牛云

    • 使用七牛官方 SDK 或表单直传
    • 上传时附带上传凭证
  3. 七牛回调服务器

    • 七牛上传完成后调用回调 URL
    • 后端验证签名是否合法(防伪造)
    • 将视频信息写入数据库(路径、大小、用户ID等)
    • 返回 200 OK

二、实现思路

1. 后端生成上传凭证

核心思路:

  • 使用七牛云 SDK 生成上传 token
  • 设置上传策略:

    • callbackUrl → 七牛回调 URL
    • callbackBody → 回调参数(文件名、hash、用户ID等)
    • saveKey → 视频存储路径规范(例如 video/{userId}/{yyyyMMdd}/{random}.mp4)

ThinkPHP 部分代码(PHP):

use Qiniu\Auth;

class VideoController extends Controller
{
   
    public function getUploadToken()
    {
   
        $accessKey = config('qiniu.accessKey');
        $secretKey = config('qiniu.secretKey');
        $bucket = config('qiniu.bucket');

        $auth = new Auth($accessKey, $secretKey);

        // 存储路径规范
        $userId = session('user_id');
        $saveKey = "video/{$userId}/".date('Ymd')."/\$(fname)";

        $policy = [
            'callbackUrl' => config('app.url').'/api/video/callback',
            'callbackBody' => 'filename=$(fname)&size=$(fsize)&hash=$(etag)&user_id='.$userId,
            'saveKey' => $saveKey
        ];

        $token = $auth->uploadToken($bucket, null, 3600, $policy);

        return json(['uptoken' => $token, 'saveKey' => $saveKey]);
    }
}

2. 前端上传视频

实现思路:

  • 用七牛提供的 JS SDK(qiniu-js)和 H5 FormData + Ajax 上传
  • 上传时需附带后端返回的 uptoken
  • 上传完成自动触发七牛回调

部分 JS:

const file = document.getElementById('videoFile').files[0];
const formData = new FormData();
formData.append('file', file);
formData.append('token', uploadToken); // 后端返回的 token

fetch('https://upload.qiniup.com/', {
   
    method: 'POST',
    body: formData
})
.then(res => res.json())
.then(data => {
   
    console.log('上传完成', data);
})
.catch(err => console.error(err));

3. 七牛云回调验证

核心思路:

  • 七牛回调会带 Authorization Header
  • 使用七牛 SDK 验证签名是否正确
  • 验证通过后,将视频信息写入数据库

ThinkPHP 部分代码:

use Qiniu\Http\Client;
use Qiniu\Auth;

class VideoController extends Controller
{
   
    public function callback()
    {
   
        $accessKey = config('qiniu.accessKey');
        $secretKey = config('qiniu.secretKey');

        $auth = new Auth($accessKey, $secretKey);

        $body = file_get_contents("php://input");
        $headers = getallheaders();

        if (!$auth->verifyCallback($headers, $body, config('qiniu.callbackUrl'))) {
   
            return json(['status' => 'fail', 'msg' => '签名验证失败'], 403);
        }

        $data = json_decode($body, true);
        $videoData = [
            'user_id' => $data['user_id'],
            'filename' => $data['filename'],
            'hash' => $data['hash'],
            'size' => $data['size'],
            'path' => "https://cdn.example.com/{$data['filename']}",
            'created_at' => time(),
        ];

        db('videos')->insert($videoData);

        return json(['status' => 'success']);
    }
}

4. 存储路径规范

video/{userId}/{yyyyMMdd}/{uuid}.mp4
  • 用户 ID 分类目录
  • 日期目录方便归档和清理
  • 文件名使用原始文件名或 UUID 避免重复
  • CDN 域名访问路径:https://cdn.example.com/video/xxx/xxx.mp4

5. 总结

  1. 前端请求后端获取上传 token(带回调和存储规则)
  2. 前端用 token 上传文件到七牛
  3. 七牛回调后端接口
  4. 后端验证签名 → 写入数据库 → 返回成功
  5. 视频路径规范 + CDN 分发,方便播放和管理
    微信截图_20250820140036.png
相关文章
|
4月前
|
SQL 自然语言处理 数据库
为什么多数智能问数项目失败不是因为技术,而是因为业务没想清楚?
本文指出:智能问数项目失败的根因并非技术不足,而是业务定义不清——对象边界模糊、术语口径不一、复合逻辑缺失。本体语义层路线通过结构化表达对象、属性、关系及业务定义,实现“又泛又准”的问数能力;相较预置或NL2SQL路线,其维护成本更可控、扩展性更强。成功前提在于企业愿投入语义治理。
|
11月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
61385 11
|
监控 Java Spring
AOP切面编程快速入门
AOP(面向切面编程)通过分离共性逻辑,简化代码、减少冗余。它通过切点匹配目标方法,在不修改原方法的前提下实现功能增强,如日志记录、性能监控等。核心概念包括:连接点、通知、切入点、切面和目标对象。Spring AOP支持多种通知类型,如前置、后置、环绕、返回后、异常通知,灵活控制方法执行流程。通过@Pointcut可复用切点表达式,提升维护性。此外,结合自定义注解,可实现更清晰的切面控制。
903 5
ThinkPHP 多应用配置,及不同域名访问不同应用的配置【详解】
本文详解了在ThinkPHP框架中配置多应用的方法,包括安装扩展、删除默认controller文件夹、创建多应用、修改配置文件以启用多应用、测试访问以及如何配置不同域名访问不同应用的步骤。
ThinkPHP 多应用配置,及不同域名访问不同应用的配置【详解】
|
Java 对象存储
java对接七牛云OSS上传
java对接七牛云OSS上传
684 2
|
XML JSON API
亚马逊商品详情 API 接口开发指南
亚马逊商品详情API为开发者、分析师及电商从业者提供了获取商品数据的便捷途径。通过HTTP/HTTPS协议,支持GET/POST请求,可指定市场代码(如US、UK)和其他参数(如数据格式、附加信息)。返回信息涵盖商品基本信息(标题、品牌等)、价格(售价、货币单位)、库存状态、评论与评分(平均分、总评论数)以及销售排名等,助力市场分析、竞品研究和业务优化。
497 22
|
人工智能 安全 数据安全/隐私保护
克劳德/claude国内能用吗?回答是: 能用! 教你两种使用方法!
Claude AI 是一款强大的对话式 AI 工具 🤖,但由于网络限制等原因 🚧,国内用户访问 Claude 的官方网站或使用集成 Claude 的第三方应用可能会遇到困难
|
缓存 JavaScript API
Flutter&鸿蒙next 状态管理框架对比分析
在 Flutter 开发中,状态管理至关重要,直接影响应用的性能和可维护性。本文对比分析了常见的状态管理框架,包括 setState()、InheritedWidget、Provider、Riverpod、Bloc 和 GetX,详细介绍了它们的优缺点及适用场景,并提供了 Provider 的示例代码。选择合适的状态管理框架需考虑应用复杂度、团队熟悉程度和性能要求。
1194 0
|
SQL 关系型数据库 MySQL
解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误
解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误
2796 3