当前位置:首页 > 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 "上传过程中发生错误";
    }
}
?>

安全增强措施

为防止安全风险,需要添加额外的验证:

php 实现视频上传

// 检查文件是否通过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');

考虑使用分片上传技术:

php 实现视频上传

// 前端使用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进行转码或生成缩略图:

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

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

相关文章

css帧动画制作视频

css帧动画制作视频

使用CSS关键帧(@keyframes)制作动画 定义关键帧动画,通过@keyframes规则指定动画在不同时间点的样式变化。例如创建一个元素从左到右移动的动画: @keyframes slide…

vue实现头像上传

vue实现头像上传

Vue 头像上传实现方法 使用 <input type="file"> 基础方法 创建文件输入控件并监听 change 事件: <template> <div>…

div css制作网页视频

div css制作网页视频

使用HTML5和CSS嵌入视频 在网页中嵌入视频可以通过HTML5的<video>标签实现,结合CSS进行样式控制。以下是一个基础示例: <video width="640" he…

vue实现视频直播

vue实现视频直播

Vue 实现视频直播的方法 使用 video.js 和 HLS 协议 安装 video.js 和 videojs-contrib-hls 插件: npm install video.js video…

vue实现上传进度

vue实现上传进度

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

vue实现批量上传

vue实现批量上传

Vue 实现批量上传的方法 使用 <input type="file"> 和 multiple 属性 在 Vue 模板中添加一个文件输入框,设置 multiple 属性以允许选择多个文件。…