PHP上传大文件的三种解决方案
在PHP中,处理大文件上传通常需要调整几个配置项,并考虑使用分块或流式传输的方法。以下是三种常见的解决方案:
增加上传限制:
修改
php.ini
文件中相关配置项,例如:
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
使用分块上传:
通过前端将文件分块发送,然后在服务器端逐个保存块,最后合并。
使用第三方库:
使用如
blueimp
的jQuery文件上传插件,它支持断点续传和分块上传。
示例代码:
// 增加上传限制
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
ini_set('max_execution_time', '300');
ini_set('max_input_time', '300');
// 处理分块上传的代码
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$chunkIndex = isset($_POST['chunkIndex']) ? intval($_POST['chunkIndex']) : 0;
$chunkTotal = isset($_POST['chunkTotal']) ? intval($_POST['chunkTotal']) : 1;
$fileName = $_POST['fileName'];
$filePath = 'uploads/'.$fileName;
// 保存块到临时文件
$tempDir = 'temp/';
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
}
$tempFile = $tempDir.$fileName.'.part'.$chunkIndex;
file_put_contents($tempFile, file_get_contents('php://input'));
// 收集所有块并合并
if ($chunkIndex == $chunkTotal - 1) {
$fileHandle = fopen($filePath, 'w');
for ($i = 0; $i < $chunkTotal; $i++) {
$tempChunk = $tempDir.$fileName.'.part'.$i;
$content = file_get_contents($tempChunk);
fwrite($fileHandle, $content);
unlink($tempChunk);
}
fclose($fileHandle);
rmdir($tempDir);
}
}
注意:实际应用中应该加入错误处理和安全性检查机制,如验证来源和上传的文件类型。
评论已关闭