php 实现视频上传
视频上传的基本实现
在PHP中实现视频上传需要处理文件上传、验证和存储。以下是一个基本的实现方法:
创建HTML表单,设置enctype为multipart/form-data:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="video" accept="video/*">
<input type="submit" value="上传视频">
</form>
处理上传的PHP脚本(upload.php):
<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["video"]["name"]);
$uploadOk = 1;
$videoFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查文件是否为视频
$validExtensions = ["mp4", "avi", "mov", "wmv"];
if(!in_array($videoFileType, $validExtensions)) {
echo "仅支持MP4, AVI, MOV, WMV格式";
$uploadOk = 0;
}
// 检查文件大小(限制为50MB)
if ($_FILES["video"]["size"] > 50000000) {
echo "文件过大,最大50MB";
$uploadOk = 0;
}
// 检查上传状态
if ($uploadOk == 0) {
echo "文件未上传";
} else {
if (move_uploaded_file($_FILES["video"]["tmp_name"], $targetFile)) {
echo "文件". htmlspecialchars(basename($_FILES["video"]["name"])). "已上传";
} else {
echo "上传过程中发生错误";
}
}
?>
安全增强措施
为防止安全风险,需要添加额外的验证:
// 检查文件是否通过HTTP POST上传
if(!is_uploaded_file($_FILES["video"]["tmp_name"])) {
die("非法文件上传");
}
// 生成唯一文件名防止覆盖
$newFileName = uniqid().'.'.$videoFileType;
$targetFile = $targetDir . $newFileName;
// 检查MIME类型
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["video"]["tmp_name"]);
$validMimes = ["video/mp4", "video/avi", "video/quicktime", "video/x-ms-wmv"];
if(!in_array($mime, $validMimes)) {
die("无效的视频文件类型");
}
大文件上传处理
对于大视频文件,可能需要调整PHP配置:
// 在php.ini中设置或使用ini_set
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
ini_set('max_execution_time', '300');
考虑使用分片上传技术:
// 前端使用File API分片
// PHP接收并合并分片
数据库记录
上传后可将视频信息存入数据库:
// 连接数据库后执行
$stmt = $pdo->prepare("INSERT INTO videos (filename, original_name, size, type, upload_date)
VALUES (?, ?, ?, ?, NOW())");
$stmt->execute([$newFileName, $_FILES["video"]["name"],
$_FILES["video"]["size"], $mime]);
进度显示
使用Ajax和session显示上传进度:
// 前端代码
xhr.upload.addEventListener("progress", function(e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
console.log(percent + "% uploaded");
}
}, false);
// PHP配置
session_start();
$_SESSION["upload_progress"] = [
"start_time" => time(),
"content_length" => $_SERVER["CONTENT_LENGTH"],
"bytes_processed" => 0
];
视频处理
上传后可调用FFmpeg进行转码或生成缩略图:
exec("ffmpeg -i ".escapeshellarg($targetFile)." -vframes 1 ".escapeshellarg($targetDir."thumb.jpg"));






