PHP文件大小只检查第一个图像



我试图从第一个输入上传一个主图像,从第二个输入上传多个图像。问题是我的第二个输入只检查第一个选择的图像。例如,我的限制是2MB。如果我选择1Mb的图像,然后选择3Mb,那么它上传两个图像都没有任何错误,我不明白为什么。它应该显示";最大2MB";。如果我先选择3Mb图像,然后选择较小的图像,它会显示错误消息。这就是为什么我认为它只检查第一个。这是有问题的部分:

if ($_FILES["images"]["size"][$i] > $maxSize || $_FILES["mainimage"]["size"] > $maxSize) {
$errorMsg = "max 2MB";
}

我想我在这里使用[$I]是正确的,所以我不知道出了什么问题。

这是我的完整代码:

if ($ok = 1) {
//IMAGE UPLOAD
$filesTempName = $_FILES['images']['tmp_name'];
$mainImageTempName = $_FILES['mainimage']['tmp_name'];
$counted = count($filesTempName);
$allowed_types = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
if (!empty($mainImageTempName)){
$mainImageDetectedType = exif_imagetype($mainImageTempName);
}

if ($counted > 5) {
$errorMsg = "Maximum 5 képet lehet feltölteni!";
} else {
for ($i = 0; $i < $counted; $i++) {
if (empty($filesTempName[$i]) && empty($mainImageTempName)) {
$mainimage = "";
$stmt->execute();
$stmt->close();
$link->close();
} elseif (!empty($mainImageTempName) && empty($filesTempName[$i])) {
$mainImageDetectedType = exif_imagetype($mainImageTempName);
if ($_FILES["mainimage"]["size"] > $maxSize) {
$errorMsg = "Minden képnek 2 Mb-nál kisebbnek kell lennie!";
} elseif (!in_array($mainImageDetectedType, $allowed_types)) {
$errorMsg = "A képek csak PNG/JPG/JPEG/GIF formátumban elfogadottak!";
} else {
$mainImageFile = $mainImageTempName;
if (is_uploaded_file($mainImageFile) && !empty($mainImageFile)) {
$mainimage = "uploads/" . time() . $_FILES["mainimage"]["name"];
move_uploaded_file($mainImageFile, $mainimage);
$stmt->execute();
$stmt->close();
}
}
} else {
$detectedType = exif_imagetype($filesTempName[$i]);
if ($_FILES["images"]["size"][$i] > $maxSize || $_FILES["mainimage"]["size"] > $maxSize) {
$errorMsg = "Minden képnek 2 Mb-nál kisebbnek kell lennie!";
} elseif (!in_array($detectedType, $allowed_types) || !in_array($mainImageDetectedType, $allowed_types)) {
$errorMsg = "A képek csak PNG/JPG/JPEG/GIF formátumban elfogadottak!";
} else {
$mainImageFile = $mainImageTempName;
if (is_uploaded_file($mainImageFile) && !empty($mainImageFile)) {
$mainimage = "uploads/" . time() . $_FILES["mainimage"]["name"];
move_uploaded_file($mainImageFile, $mainimage);
}
$stmt->execute();
$stmt->close();
$productid = $link->insert_id;
$statement = $link->prepare("INSERT INTO images(thumbnailimage, productid) VALUES(?, ?)");
for ($i = 0; $i < $counted; $i++) {
$file = $filesTempName[$i];
if (is_uploaded_file($file) && !empty($file)) {
$data = "uploads/" . time() . $_FILES["images"]["name"][$i];
move_uploaded_file($file, $data);
$statement->bind_param("si", $data, $productid);
$statement->execute();
}
}
$statement->close();
$link->close();
}
}
}
}
}

对于这个循环:

if ($_FILES["images"]["size"][$i] > $maxSize || $_FILES["mainimage"]["size"] > $maxSize) {
$errorMsg = "Minden képnek 2 Mb-nál kisebbnek kell lennie!";
} elseif (!in_array($detectedType, $allowed_types) || !in_array($mainImageDetectedType, $allowed_types)) {
$errorMsg = "A képek csak PNG/JPG/JPEG/GIF formátumban elfogadottak!";
} else {  
// .... other commands
}

系统将检查上传文件的大小是否大于$maxSize,但下一次迭代将覆盖上一次迭代,因为您将结果存储在单个变量$errorMsg中。因此,如果最后上传的文件和";第一主文件";如果不大于$maxSize,系统将返回另一个结果。

因此,通常的做法是,当条件满足预定义的检查时,在每次迭代中增加错误计数。

稍微修改一下代码来解决这个问题可以是这样的:

$filesize_error=0;
if ($_FILES["images"]["size"][$i] > $maxSize || $_FILES["mainimage"]["size"] > $maxSize) {
// $errorMsg = "Minden képnek 2 Mb-nál kisebbnek kell lennie!";
$filesize_error++;
} elseif (!in_array($detectedType, $allowed_types) || !in_array($mainImageDetectedType, $allowed_types)) {
$errorMsg = "A képek csak PNG/JPG/JPEG/GIF formátumban elfogadottak!";
} else {  
// .... other commands
}

然后,您可以检查$filesize_error是否大于0(在迭代之后(,以确定您上载的一个或多个文件是否超过了允许的最大文件大小,然后执行您想要的操作。

最新更新