当前位置:首页 > 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进行转码或生成缩略图:

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

php 实现视频上传

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

相关文章

vue实现头像上传

vue实现头像上传

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

vue实现分片播放视频

vue实现分片播放视频

实现分片播放视频的基本思路 分片播放视频的核心是将视频文件分割为多个片段,按需加载和播放。Vue中可通过HTML5的<video>标签结合自定义逻辑实现。 视频分片处理 视频文件需提前…

elementui视频

elementui视频

以下是关于 ElementUI 视频资源的整理,涵盖教程、实战案例和官方资源: ElementUI 官方视频资源 ElementUI 官方文档虽以文字为主,但部分社区或第三方平台可能有官方团队发布…

h5怎么实现上传视频

h5怎么实现上传视频

使用HTML5实现视频上传 HTML5提供了<input type="file">元素用于文件上传,结合<video>标签可以实现视频上传和预览功能。 <input…

vue实现视频

vue实现视频

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

h5实现抖音刷视频

h5实现抖音刷视频

实现抖音刷视频的H5页面 实现类似抖音的刷视频功能需要结合H5的视频播放、手势交互和无限滚动等技术。以下是关键实现步骤: 视频播放与布局 使用HTML5的<video>标签实现视频播放容…