php 实现上传视频
上传视频的基本实现
在PHP中实现视频上传功能,主要涉及文件处理、类型验证和存储管理。以下是一个完整的实现方法:
创建HTML表单用于选择视频文件:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="video" accept="video/*">
<input type="submit" value="Upload">
</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 "上传过程中发生错误";
}
}
?>
安全增强措施
增加文件重命名防止覆盖:
$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/quicktime", "video/x-ms-wmv"];
if(!in_array($mime, $validMimes)) {
echo "无效的视频文件类型";
$uploadOk = 0;
}
finfo_close($finfo);
大文件上传配置
修改php.ini配置以支持大文件上传:
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
进度显示实现
使用JavaScript实现上传进度显示:
document.querySelector('form').addEventListener('submit', function(e) {
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function(evt) {
if (evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
console.log(percentComplete + '% uploaded');
}
}, false);
xhr.open('POST', 'upload.php', true);
xhr.send(new FormData(this));
e.preventDefault();
});
分块上传方案
对于超大视频文件,建议实现分块上传:
// 前端将文件分块后发送
// 后端接收并合并分块
$chunkNumber = $_POST['chunkNumber'];
$totalChunks = $_POST['totalChunks'];
$fileName = $_POST['fileName'];
file_put_contents("uploads/$fileName.part$chunkNumber", file_get_contents($_FILES['chunk']['tmp_name']));
if($chunkNumber == $totalChunks) {
// 合并所有分块
$finalFile = fopen("uploads/$fileName", 'w');
for($i=1; $i<=$totalChunks; $i++) {
fwrite($finalFile, file_get_contents("uploads/$fileName.part$i"));
unlink("uploads/$fileName.part$i");
}
fclose($finalFile);
}






