php实现上传视频文件
上传视频文件的基本流程
在PHP中实现视频文件上传需要处理文件接收、验证、存储等步骤。以下是实现的核心要点:
创建HTML表单
表单需要设置enctype="multipart/form-data"属性以支持文件上传:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="video_file" accept="video/*">
<input type="submit" value="Upload">
</form>
处理文件上传的PHP代码
在服务器端脚本中(如upload.php),通过$_FILES超全局数组获取上传文件信息:
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["video_file"]["name"]);
$uploadOk = 1;
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
文件验证
对上传文件进行类型和大小验证:
// 检查是否为真实视频文件
$check = getimagesize($_FILES["video_file"]["tmp_name"]);
if($check !== false && strpos($check['mime'], 'video/') === 0) {
$uploadOk = 1;
} else {
$uploadOk = 0;
}
// 检查文件大小(50MB限制)
if ($_FILES["video_file"]["size"] > 50000000) {
$uploadOk = 0;
}
// 允许的视频格式
$allowedTypes = ["mp4", "avi", "mov", "wmv"];
if(!in_array($fileType, $allowedTypes)) {
$uploadOk = 0;
}
执行上传
通过move_uploaded_file()函数将临时文件移动到目标位置:
if ($uploadOk) {
if (move_uploaded_file($_FILES["video_file"]["tmp_name"], $targetFile)) {
echo "文件上传成功";
} else {
echo "上传过程中出现错误";
}
} else {
echo "文件未通过验证";
}
安全增强措施
增加文件名安全处理和目录权限检查:
// 生成唯一文件名防止冲突
$newFileName = uniqid() . '.' . $fileType;
$targetFile = $targetDir . $newFileName;
// 检查上传目录是否存在
if (!file_exists($targetDir)) {
mkdir($targetDir, 0755, true);
}
大文件上传处理
对于大视频文件,可能需要调整PHP配置:
// 在php.ini中设置或通过ini_set()
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
ini_set('max_execution_time', '300');
分块上传实现
对于超大视频文件,可以考虑分块上传:
// 前端JavaScript代码示例
// 将文件分割为多个块并逐个上传
// 后端接收分块并合并
$chunkNumber = $_POST['chunkNumber'];
$totalChunks = $_POST['totalChunks'];
$fileName = $_POST['fileName'];
// 存储临时分块
file_put_contents("temp/$fileName.$chunkNumber", file_get_contents($_FILES['chunk']['tmp_name']));
// 全部分块上传完成后合并
if ($chunkNumber == $totalChunks - 1) {
// 合并所有分块
}
进度显示实现
使用AJAX和session实现上传进度显示:
// 启用上传进度跟踪
session_start();
$_SESSION['upload_progress'] = [
'start_time' => time(),
'bytes_processed' => 0,
'content_length' => $_SERVER['CONTENT_LENGTH']
];
错误处理
完善错误处理机制:

switch ($_FILES['video_file']['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
echo '文件大小超过限制';
break;
case UPLOAD_ERR_PARTIAL:
echo '文件只有部分被上传';
break;
case UPLOAD_ERR_NO_FILE:
echo '没有文件被上传';
break;
case UPLOAD_ERR_NO_TMP_DIR:
echo '缺少临时文件夹';
break;
case UPLOAD_ERR_CANT_WRITE:
echo '写入磁盘失败';
break;
default:
echo '未知上传错误';
}
以上代码提供了从基础到进阶的视频上传实现方法,可根据实际需求进行调整和扩展。






