当前位置:首页 > PHP

php实现上传视频文件

2026-02-13 21:54:09PHP

文件上传表单设计

创建HTML表单,设置enctype="multipart/form-data"以支持文件上传。表单需包含file类型的输入字段。

<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脚本中通过$_FILES超全局数组获取上传文件信息。需验证文件类型、大小及错误状态。

$targetDir = "uploads/";
$maxFileSize = 500 * 1024 * 1024; // 500MB
$allowedTypes = ['video/mp4', 'video/quicktime'];

if ($_FILES['video_file']['error'] !== UPLOAD_ERR_OK) {
    die("Upload error: " . $_FILES['video_file']['error']);
}

if ($_FILES['video_file']['size'] > $maxFileSize) {
    die("File exceeds maximum size limit");
}

if (!in_array($_FILES['video_file']['type'], $allowedTypes)) {
    die("Invalid file type");
}

安全存储处理

生成唯一文件名防止冲突,使用move_uploaded_file()函数安全存储文件。

$fileExtension = pathinfo($_FILES['video_file']['name'], PATHINFO_EXTENSION);
$newFileName = uniqid() . '.' . $fileExtension;
$targetPath = $targetDir . $newFileName;

if (!move_uploaded_file($_FILES['video_file']['tmp_name'], $targetPath)) {
    die("Failed to move uploaded file");
}

文件类型深度验证

除MIME类型外,建议使用finfo扩展进行二进制内容验证。

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$detectedType = finfo_file($finfo, $_FILES['video_file']['tmp_name']);
finfo_close($finfo);

if (!in_array($detectedType, $allowedTypes)) {
    unlink($_FILES['video_file']['tmp_name']);
    die("File content does not match declared type");
}

大文件上传优化

对于大视频文件,可在php.ini中调整以下参数:

upload_max_filesize = 512M
post_max_size = 520M
max_execution_time = 300

或通过.htaccess文件设置:

php_value upload_max_filesize 512M
php_value post_max_size 520M
php_value max_execution_time 300

分块上传实现

对于超大文件,可采用分块上传技术。前端使用JavaScript将文件分片,后端合并分片。

php实现上传视频文件

// 接收分片文件
$chunkNumber = $_POST['chunk'];
$totalChunks = $_POST['total'];
$tempDir = "temp_uploads/";

if (!file_exists($tempDir)) {
    mkdir($tempDir, 0755, true);
}

$tempFilePath = $tempDir . $_FILES['file']['name'] . '.part' . $chunkNumber;
move_uploaded_file($_FILES['file']['tmp_name'], $tempFilePath);

// 合并分片
if ($chunkNumber == $totalChunks - 1) {
    $finalPath = $targetDir . $_FILES['file']['name'];
    $fp = fopen($finalPath, 'wb');

    for ($i = 0; $i < $totalChunks; $i++) {
        $chunkPath = $tempDir . $_FILES['file']['name'] . '.part' . $i;
        $chunkContent = file_get_contents($chunkPath);
        fwrite($fp, $chunkContent);
        unlink($chunkPath);
    }

    fclose($fp);
}

分享给朋友:

相关文章

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue实现excel上传预览

vue实现excel上传预览

vue实现excel上传预览的方法 使用xlsx库解析Excel文件 安装xlsx库来处理Excel文件: npm install xlsx 在Vue组件中引入xlsx库: import * as…

vue怎么实现头像上传

vue怎么实现头像上传

Vue 实现头像上传的方法 使用 <input type="file"> 获取文件 通过 HTML 的 <input type="file"> 元素让用户选择文件。在 Vue…

react实现录制视频上传

react实现录制视频上传

实现视频录制与上传的基本流程 使用React实现视频录制并上传需要结合浏览器提供的媒体API和HTTP上传功能。以下是关键步骤: 获取用户摄像头权限 使用navigator.mediaDevices…

php实现上传进度条

php实现上传进度条

PHP 文件上传进度条实现方法 在PHP中实现文件上传进度条需要结合前端和后端技术,以下是一种常见的实现方案: 使用 session.upload_progress 功能 PHP 5.4+ 内置了上…

js实现上传进度条

js实现上传进度条

使用XMLHttpRequest实现上传进度条 XMLHttpRequest是传统的AJAX请求方式,支持上传进度监控。通过监听upload对象的progress事件获取上传进度信息。 const…