php 实现上传视频
上传视频的基本流程
在PHP中实现视频上传功能需要处理文件接收、验证、存储等步骤。以下是实现的核心方法:
创建HTML表单
构建一个包含文件上传字段的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="Upload">
</form>
处理文件上传的PHP脚本
在服务器端脚本(如upload.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 "File is not a video.";
$uploadOk = 0;
}
}
// 检查文件是否已存在
if (file_exists($targetFile)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// 限制文件大小(例如50MB)
if ($_FILES["video"]["size"] > 50000000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// 允许特定格式
$allowedFormats = ["mp4", "avi", "mov", "wmv"];
if(!in_array($videoFileType, $allowedFormats)) {
echo "Sorry, only MP4, AVI, MOV & WMV files are allowed.";
$uploadOk = 0;
}
// 检查上传状态
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["video"]["tmp_name"], $targetFile)) {
echo "The file ". htmlspecialchars(basename($_FILES["video"]["name"])). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
?>
增强安全性措施
为了防止安全漏洞,建议添加以下防护措施:
// 生成唯一文件名
$newFileName = uniqid() . '.' . $videoFileType;
$targetFile = $targetDir . $newFileName;
// 禁用危险函数
if (function_exists('exif_imagetype')) {
$imageType = exif_imagetype($_FILES["video"]["tmp_name"]);
if (!in_array($imageType, [IMAGETYPE_AVIF, IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP])) {
die("Invalid file type");
}
}
// 设置文件权限
chmod($targetFile, 0644);
处理大文件上传
对于大视频文件,可能需要调整PHP配置:
// 在php.ini中设置(或通过ini_set)
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
ini_set('max_execution_time', '300');
显示上传进度
可以使用JavaScript和PHP配合显示上传进度:
// HTML部分
<progress id="progressBar" value="0" max="100"></progress>
// 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;
document.getElementById('progressBar').value = percentComplete;
}
}, false);
return xhr;
});
视频转码处理
上传后可能需要转码为统一格式:

// 使用FFmpeg转码
exec("ffmpeg -i $targetFile -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k $targetDir/output.mp4");
以上方法提供了PHP实现视频上传功能的基础框架,可根据实际需求进行调整和扩展。






