当前位置:首页 > PHP

php 实现视频上传

2026-01-30 08:07:21PHP

视频上传的基本实现

在PHP中实现视频上传需要处理文件上传、验证和存储。以下是一个基本的实现方法:

创建HTML表单,设置enctypemultipart/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进行转码或生成缩略图:

php 实现视频上传

exec("ffmpeg -i ".escapeshellarg($targetFile)." -vframes 1 ".escapeshellarg($targetDir."thumb.jpg"));

标签: 上传视频
分享给朋友:

相关文章

vue实现头像上传

vue实现头像上传

实现头像上传功能 在Vue中实现头像上传功能通常需要结合文件上传组件和后端接口处理。以下是具体实现步骤: 前端组件实现 创建文件上传组件模板部分: <template> <d…

vue实现视频

vue实现视频

Vue 实现视频播放功能 Vue 可以通过集成第三方库或直接使用 HTML5 的 <video> 标签来实现视频播放功能。以下是几种常见的方法: 使用 HTML5 <video&g…

vue实现视频通话

vue实现视频通话

Vue实现视频通话的方法 使用WebRTC技术 WebRTC是一种支持浏览器之间实时通信的技术,无需插件即可实现视频通话。Vue可以结合WebRTC的API实现视频通话功能。 安装必要的依赖库:…

vue实现缓存视频

vue实现缓存视频

Vue 实现视频缓存的方法 在 Vue 中实现视频缓存可以通过多种方式完成,包括使用浏览器的缓存机制、Service Worker 或者借助第三方库。以下是几种常见的方法: 使用 Service W…

vue 实现上传视频

vue 实现上传视频

使用 Vue 实现上传视频功能 在 Vue 中实现上传视频功能,通常需要结合 HTML 的 <input type="file"> 元素和 Vue 的事件处理。以下是具体实现方法: 基本…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式: 使…