php 实现视频上传
视频上传功能实现
在PHP中实现视频上传功能需要处理文件接收、验证、存储等步骤。以下是一个完整的实现方案:
创建HTML表单
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="video" accept="video/*">
<button type="submit">上传视频</button>
</form>
处理上传的PHP脚本
<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["video"]["name"]);
$uploadOk = 1;
$videoFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查是否为真实视频文件
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["video"]["tmp_name"]);
if($check !== false) {
$uploadOk = 1;
} else {
echo "文件不是视频格式";
$uploadOk = 0;
}
}
// 检查文件是否已存在
if (file_exists($targetFile)) {
echo "抱歉,文件已存在";
$uploadOk = 0;
}
// 限制文件大小 (50MB)
if ($_FILES["video"]["size"] > 50000000) {
echo "抱歉,文件太大";
$uploadOk = 0;
}
// 允许特定视频格式
$allowedFormats = ["mp4", "avi", "mov", "wmv"];
if(!in_array($videoFileType, $allowedFormats)) {
echo "抱歉,只支持MP4, AVI, MOV, WMV格式";
$uploadOk = 0;
}
// 检查上传标志
if ($uploadOk == 0) {
echo "抱歉,文件未上传";
} else {
if (move_uploaded_file($_FILES["video"]["tmp_name"], $targetFile)) {
echo "文件". htmlspecialchars(basename($_FILES["video"]["name"])). "已上传";
} else {
echo "抱歉,上传文件时出错";
}
}
?>
安全增强措施
设置正确的文件权限,确保上传目录不可执行
chmod($targetDir, 0755);
添加文件重命名功能避免冲突

$newFileName = uniqid().'.'.$videoFileType;
$targetFile = $targetDir . $newFileName;
限制上传文件类型更严格检查
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["video"]["tmp_name"]);
$allowedMimes = ["video/mp4", "video/avi", "video/quicktime", "video/x-ms-wmv"];
if(!in_array($mime, $allowedMimes)) {
$uploadOk = 0;
}
finfo_close($finfo);
数据库记录存储
如果需要将上传信息存入数据库:

$pdo = new PDO("mysql:host=localhost;dbname=yourdb", "username", "password");
$stmt = $pdo->prepare("INSERT INTO videos (filename, path, size, type) VALUES (?, ?, ?, ?)");
$stmt->execute([
$_FILES["video"]["name"],
$targetFile,
$_FILES["video"]["size"],
$_FILES["video"]["type"]
]);
进度显示实现
使用AJAX实现上传进度显示
// 前端JavaScript
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", function(e) {
var percent = Math.round((e.loaded / e.total) * 100);
document.getElementById("progress").innerHTML = percent + "%";
}, false);
xhr.open("POST", "upload.php", true);
xhr.send(formData);
大文件分块上传
对于超大视频文件,考虑分块上传
// 接收分块文件
$chunk = $_FILES["file"]["tmp_name"];
$chunkNumber = $_POST["chunkNumber"];
$totalChunks = $_POST["totalChunks"];
$fileName = $_POST["fileName"];
$tempDir = "temp_uploads/";
$tempFile = $tempDir . $fileName . ".part" . $chunkNumber;
move_uploaded_file($chunk, $tempFile);
// 所有分块上传完成后合并
if ($chunkNumber == $totalChunks - 1) {
$finalFile = "uploads/" . $fileName;
$out = fopen($finalFile, "wb");
for ($i = 0; $i < $totalChunks; $i++) {
$partFile = $tempDir . $fileName . ".part" . $i;
$in = fopen($partFile, "rb");
while ($buff = fread($in, 4096)) {
fwrite($out, $buff);
}
fclose($in);
unlink($partFile);
}
fclose($out);
}
以上代码提供了从基础到进阶的视频上传实现方案,可根据实际需求进行调整和扩展。






