2026年03月25日/ 浏览 1
正文:
在Web开发中,文件上传是常见的功能需求,但当文件体积较大(如视频、高清图片等)时,传统的PHP文件上传方式可能会遇到服务器超时、内存不足等问题。如何高效处理大文件上传?分片上传和进度条显示是两大关键技术。
PHP默认通过$_FILES全局变量处理上传文件,但存在以下问题:
1. 内存占用高:PHP会将整个文件加载到内存,大文件容易触发memory_limit限制。
2. 超时风险:默认脚本执行时间(max_execution_time)可能导致上传中断。
3. 无进度反馈:用户无法实时了解上传进度,体验较差。
分片上传(Chunked Upload)将大文件切割为多个小块,分批上传到服务器,最后合并为完整文件。其核心步骤如下:
File API(如Blob.slice())将文件分块。 以下是一个简单的PHP分片处理代码:
// 分片上传处理示例
$targetDir = "uploads/tmp/";
$chunkNumber = $_POST['chunkNumber'];
$totalChunks = $_POST['totalChunks'];
$fileName = $_POST['fileName'];
// 临时存储分片
$chunkPath = $targetDir . $fileName . ".part" . $chunkNumber;
move_uploaded_file($_FILES['file']['tmp_name'], $chunkPath);
// 检查是否全部上传完成
if ($chunkNumber == $totalChunks) {
$finalPath = "uploads/" . $fileName;
$fp = fopen($finalPath, 'wb');
for ($i = 1; $i <= $totalChunks; $i++) {
$chunk = $targetDir . $fileName . ".part" . $i;
fwrite($fp, file_get_contents($chunk));
unlink($chunk); // 删除临时分片
}
fclose($fp);
echo "上传成功!";
}
进度条需要前端与后端配合,常见方案有两种:
XHR Progress事件:通过XMLHttpRequest的progress事件监听上传进度。
javascript
// 前端进度监听示例
xhr.upload.addEventListener("progress", function(e) {
if (e.lengthComputable) {
var percent = (e.loaded / e.total) * 100;
progressBar.style.width = percent + "%";
}
});
Session存储进度(需配合AJAX轮询):
PHP将已上传的字节数写入Session,前端定时请求获取进度。
// PHP记录上传进度
session_start();
$_SESSION['upload_progress'] = [
'bytes_processed' => $_SERVER['CONTENT_LENGTH'],
'content_length' => filesize($_FILES['file']['tmp_name'])
];
php.ini中的upload_max_filesize、post_max_size等参数。 通过分片上传和进度条技术,PHP可以高效稳定地处理大文件上传,提升用户体验。开发者需根据实际需求选择合适方案,并注重安全性与性能平衡。