假设域名:www.test.com
详情控制器
// 详情页
public function detail(){
$_SESSION[‘play_token‘] = md5("laofan666"); //做一个token 用于失效方案
return View::fetch(‘video/detail‘);
}
详情页
<video controls="controls" autoplay="autoplay">
<source type="video/ogg" src="http://www.test.com/video/paly?id=1" />
Your browser does not support the video tag.
</video>
获取播放资源
//处理播放资源
public function paly(){
$request_data = Request::param();
//数据库存放的资源id
$vid = (int)$request_data[‘id‘];
//通过vid 获取 数据库存放的真实资源地址
$data_mes = Db::name(‘video‘)->field(‘video_url‘)->where(‘id‘,$vid)->find();
if($_SESSION["play_token"]){
//删除token,保证每次只能播放一次
//此处能做的东西就很多了,可以参考下方建议
unset($_SESSION["play_token"]);
}
//页面直接输出视频
$filePath=$data_mes[‘video_url‘];
ini_set(‘memory_limit‘, ‘512M‘);
header("Pragma: public");
header("Expires: 0");
header("Content-Type: application/octet-stream"); //文件mime类型
ob_clean();
flush();
@readfile($filePath);
}
页面链接只需要访问 详情控制器,就可以看到效果
www.test.com/video/detail/1.html
关于token设计
用户登陆观看, 用户id + 视频id + 失效时间,存放一条记录,校验token
无需登陆观看,ip地址&浏览器等信息 + 视频id + 失效时间, 存放一条记录 校验token
后话:代码预防下载只能暂时性的处理,要是用户录屏呢,一帧一帧的截取呢,手动滑稽.jpg
原文:https://www.cnblogs.com/richerdyoung/p/12710466.html