thinkphp上传视频流程与普通文件一致,需通过request获取文件、验证类型/大小、存入public/video目录并返回可访问url。前端需设enctype="multipart/form-data",后端须校验扩展名、mime类型及尺寸,禁止脚本执行且避免原始文件名。

ThinkPHP 中上传视频文件和上传普通文件流程一致,核心是使用框架内置的 File 类或 Request 对象处理上传,并配合合理的验证与存储逻辑。关键在于控制文件类型、大小、路径安全及后续可访问性。
1. 前端表单需支持文件上传
确保 HTML 表单设置正确,尤其是 enctype="multipart/form-data",否则 PHP 无法接收文件数据:
注意:accept="video/*" 是浏览器层面提示,不能替代后端校验。
2. 后端接收并验证视频文件(以 ThinkPHP 6 为例)
在控制器中获取上传文件,进行类型、大小、后缀等判断:
- 使用
$this->request->file('video')获取上传对象 - 限制允许的视频类型(如 mp4、avi、mov、webm)和最大尺寸(如 500MB)
- 调用
validate()方法做基础校验,也可手动检查getOriginalExtension()和getSize()
// 示例代码(控制器方法)
public function upload()
{
$file = $this->request->file('video');
if (empty($file)) {
return json(['code' => 0, 'msg' => '未选择文件']);
}
<pre class="brush:php;toolbar:false;">// 验证:后缀、MIME 类型、大小
$allowExt = ['mp4', 'avi', 'mov', 'webm', 'mkv'];
$allowType = ['video/mp4', 'video/avi', 'video/quicktime', 'video/webm', 'video/x-matroska'];
$maxSize = 500 * 1024 * 1024; // 500MB
$ext = $file->getOriginalExtension();
$type = $file->getMimeType();
if (!in_array(strtolower($ext), $allowExt)) {
return json(['code' => 0, 'msg' => '不支持的视频格式']);
}
if (!in_array($type, $allowType)) {
return json(['code' => 0, 'msg' => 'MIME 类型不合法']);
}
if ($file->getSize() > $maxSize) {
return json(['code' => 0, 'msg' => '文件超过 500MB']);
}
// 保存到 public/video/ 目录,自动生成唯一文件名
$savePath = 'video/';
$info = $file->move(public_path() . $savePath);
if ($info) {
$url = '/'.$savePath.$info->getSaveName();
return json(['code' => 1, 'msg' => '上传成功', 'url' => $url]);
} else {
return json(['code' => 0, 'msg' => '保存失败:'.$file->getError()]);
}}
3. 安全与路径注意事项
- 不要将上传目录放在
app/或runtime/等敏感路径下,推荐存入public/下的子目录(如public/video/),便于直接通过 URL 访问 - 禁用上传目录下的脚本执行(如 Apache 加
.htaccess,Nginx 配置location ~ ^/video/.*\.(php|exe|sh)$ { deny all; }) - 避免直接使用客户端传来的原始文件名,用
move()自动生成安全文件名(ThinkPHP 默认已处理) - 如需数据库记录,保存相对路径或完整 URL,而非物理路径
4. 播放与前端调用示例
上传成功后返回的 URL 可直接用于 <video></video> 标签:
<video controls width="600"><source src="/video/20240510/abc123.mp4" type="video/mp4"> 您的浏览器不支持 video 标签。 </source></video>
若需流式播放大视频,建议启用 Nginx 的 mp4 模块或使用 HLS 分片方案,但那是进阶优化,基础上传无需额外处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











