PHP无法识别的最大文件大小

时间:2015-05-04 06:27:11

标签: php

我有这个图片上传PHP文件。一切似乎都有效,除了最大尺寸(300k),因为它接受任何尺寸的图像......

<?php
if((!empty($_FILES["ex1"])) && ($_FILES['ex1']['error'] == 0)) {

  $filename = basename($_FILES['ex1']['name']);

  $ext = substr($filename, strrpos($filename, '.') + 1);

  if (($ext == "jpg") || ($ext == "jpeg") || ($ext == "png") || ($ext == "gif") && ($_FILES["ex1"]["type"] == "image/jpeg") || ($_FILES["ex1"]["type"] == "image/png") || ($_FILES["ex1"]["type"] == "image/gif") && 
    ($_FILES["ex1"]["size"] < 30000)) {

      $newname = dirname(__FILE__).'/../temp/'.time();

      if (!file_exists($newname)) {

          if ((move_uploaded_file($_FILES['ex1']['tmp_name'],$newname.'.'.$ext))) {
           echo "Hecho! Guardada como: ".$newname;
        } else {
           echo "Error: Se produjo un problema durante la subida".$newname;
        }
      } else {
         echo "Error: El archivo ".$_FILES["ex1"]["name"]." ya existe";
      }
  } else {
     echo "Error: Tamaño máximo excedido (300kb) o formato erróneo (jpg, png, gif)";
  }
} else {
 echo "Error: No existe el archivo";
}
?>

3 个答案:

答案 0 :(得分:1)

&&的优先级高于||,因此a || b && c等于a || (b && c)
你有:

($_FILES["ex1"]["type"] == "image/gif") && ($_FILES["ex1"]["size"] < 30000)

这意味着,只有GIF图像必须小于300KB 在您的&#34;或&#34;周围放置括号团体:

if (
    (($ext == "jpg") || ($ext == "jpeg") || ($ext == "png") || ($ext == "gif")) &&
    (($_FILES["ex1"]["type"] == "image/jpeg") || ($_FILES["ex1"]["type"] == "image/png") || ($_FILES["ex1"]["type"] == "image/gif")) &&
    ($_FILES["ex1"]["size"] < 30000)
   )
{

答案 1 :(得分:1)

您缺少一些括号。 OR将覆盖AND,当一个条件匹配时,一切都将为真。

在OR块周围放置括号,如下所示:

if (
    (
        ($ext == "jpg") || ($ext == "jpeg") || ($ext == "png") || ($ext == "gif") 
    ) && (
        ($_FILES["ex1"]["type"] == "image/jpeg") || ($_FILES["ex1"]["type"] == "image/png") || ($_FILES["ex1"]["type"] == "image/gif") 
    ) && (
        ($_FILES["ex1"]["size"] < 30000)
    )
) {

(缩进以提高可读性)

在检查文件大小时,您在30000中错过了一个零。

  

300000相当于大约300KB。

所以,改变

$_FILES["ex1"]["size"] < 30000

$_FILES["ex1"]["size"] < 300000

答案 2 :(得分:1)

Gerald和Siguza都对他们所说的是正确的。但是,我想添加一些内容。

大而复杂的IF条件严重影响了代码的可读性。你有兴趣做这样的事情:

function handleUpload(){
    $maxFileSize = 30000;
    $allowedExtensions = array('jpg','jpeg','gif');

    if($_FILES["ex1"]["size"] > $maxFileSize){
        echo "File is too big";
        return false;
    }

    $ext = substr($filename, strrpos($filename, '.') + 1);

    if(!in_array($ext, $allowedExtensions)){
        echo "Extension not allowed";
        return false
    }
    // Handle upload
    return true;
}

目标是: 1 - 尽快返回,这使代码更易于阅读和调试 2 - 不要制作复杂的结构,这使代码更容易阅读和调试 3 - 允许对每个块进行注释,并在上载失败时输出更准确的消息。

如果您遵循这种结构,您可以更快,更轻松地编写代码并减少出错的机会。

我希望这会有所帮助。