如何用PHP上传500MB以上的大文件?
可以使用两种方式使用PHP上传大文件。这两个都在下面讨论-
通过更改php.ini文件中的upload_max_filesize限制。
通过实现文件块上载,可以将上载拆分为较小的块,并在完成上载时将这些块组装在一起。
可以如下所示更新php.ini文件-
upload_max_filesize = 50M post_max_size = 50M max_input_time = 300 max_execution_time = 300
应该避免这种情况,因为它也会更改服务器和其他项目的设置。
更新htacess文件
php_value upload_max_filesize 50M php_value post_max_size 50M php_value max_input_time 300 php_value max_execution_time 300
更改内联设置-
<?php
//更改上传限制
ini_set('upload_max_filesize', '50M');
ini_set('post_max_size', '50M');
ini_set('max_input_time', 300);
ini_set('max_execution_time', 300);
//设置目标文件夹
$source = $_FILES["file-upload"]["tmp_name"];
$destination = $_FILES["file-upload"]["name"];
//上载的文件夹已移至目的地
move_uploaded_file($source, $destination);
?>块状
在此过程中,将大文件拆分为较小的部分,然后上传。可以下载和使用“Plupload”库。
<?php
//响应功能
function verbose($ok=1,$info=""){
//上载失败引发400错误
if ($ok==0) { http_response_code(400); }
die(json_encode(["ok"=>$ok, "info"=>$info]));
}
//无效上传
if (empty($_FILES) || $_FILES['file']['error']) {
verbose(0, "无法移动上载的文件。");
}
//上传目的地
$filePath = __DIR__ . DIRECTORY_SEPARATOR . "uploads";
if (!file_exists($filePath)) {
if (!mkdir($filePath, 0777, true)) {
verbose(0, "Failed to create $filePath");
}
}
$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : $_FILES["file"]["name"];
$filePath = $filePath . DIRECTORY_SEPARATOR . $fileName;
//处理块
$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;
$out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
if ($out) {
$in = @fopen($_FILES['file']['tmp_name'], "rb");
if ($in) {
while ($buff = fread($in, 4096)) { fwrite($out, $buff); }
} else {
verbose(0, "Failed to open input stream");
}
@fclose($in);
@fclose($out);
@unlink($_FILES['file']['tmp_name']);
} else {
verbose(0, "Failed to open output stream");
}
//检查文件是否已上传
if (!$chunks || $chunk == $chunks - 1) {
rename("{$filePath}.part", $filePath);
}
verbose(1, "Upload OK");
?>尝试上载大于500MB的文件时,将成功上载该文件。