PHP - 通过$ _FILES循环检查文件类型

Sta*_*0rz 7 php loops file-upload

关于SO的第一个问题,谢谢.:)

我正在为我的公司开发支持问题日志系统,它必须允许上传文件以及提交到我们数据库的任何问题.可能有0-6个不同的上传要检查,以及支持问题.我已经设法通过具有经由JS更新每当图像通过类型="文件"输入而选择,或者从模中取出的隐藏输入字段(imgcount)得到的有多少个文件的精确的变量.

我的[输入类型="文件"]名称是image1,image2等.因为我认为通过它们循环它会更容易.

提交表单时,以下代码会查看是否有任何文件并检查它们是否为有效类型(gif/jpeg/png),以便可以安全地上载它们.我不太担心病毒,因为支持系统有一个很好的安全登录,我们相信我们的客户.

$sscount = $_POST['imgcount'];
echo $sscount; //to test the variable
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){
        if (($_FILES["image$i"]["type"] == "image/gif")
        || ($_FILES["image$i"]["type"] == "image/jpeg")
        || ($_FILES["image$i"]["type"] == "image/png" )
        && ($_FILES["image$i"]["size"] < 500000))
        {

        }
        else
        {
        $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎没有正确循环,任何人有任何想法如何让它循环并正确返回?

Pau*_*xon 9

&&运算符的优先级高于||,因此(A OR B OR C) AND D实际上并非如您所愿A OR B OR (C AND D)

您可以使用括号来强制执行您想要的评估.

但是,像这样的东西可能更清洁,更容易维护/阅读:

$allowed_types=array(
    'image/gif',
    'image/jpeg',
    'image/png',
);


$sscount = $_POST['imgcount'];
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){

        if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
            ($_FILES["image$i"]["size"] < 500000))
        {

        }

    }
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*igh 5

这不是您的问题的直接答案,但您可以将表单值作为数组传递给PHP,这应该更容易循环.in_array()对于检查值是否在允许列表中也很有用.

HTML:

<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
Run Code Online (Sandbox Code Playgroud)

PHP:

<?php
if (isset($_FILES['image'])) {
    foreach ($_FILES['image'] as $file) {
        if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png"))
           || $file['size'] > 500000) {
           //error
        } else {
           //ok
        }
    }
}
Run Code Online (Sandbox Code Playgroud)