PHP文件类型限制

PHP文件类型限制,php,file-upload,file-type,Php,File Upload,File Type,我正在试用PHP我的第一个实际脚本,大部分来自教程:( 反正 我在这方面有问题 // This is our limit file type condition if (!($uploaded_type=="text/java")||!($uploaded_type=="file/class")||!($uploaded_type=="file/jar")) { echo "You may only upload Java files.<br>"; $ok=0; } //这是我们

我正在试用PHP我的第一个实际脚本,大部分来自教程:( 反正

我在这方面有问题

// This is our limit file type condition
if (!($uploaded_type=="text/java")||!($uploaded_type=="file/class")||!($uploaded_type=="file/jar")) {
echo "You may only upload Java files.<br>";

$ok=0;
}
//这是我们的限制文件类型条件
如果(!($uploaded_type==“text/java”)| |!($uploaded_type==“file/class”)| |!($uploaded_type==“file/jar”)){
echo“您只能上载Java文件。
”; $ok=0; }
基本上它不允许任何文件,即使是上面的文件 救命啊! 我希望Java文件只被允许

编辑: 这是完整的代码

<?php
$target = "upload/";
$target = $target . basename( $_FILES['uploaded']['name']) ;
$uploaded = basename( $_FILES['uploaded']['name']) ;
$ok=1;

//This is our size condition
if ($uploaded_size > 350000) {
    echo "Your file is too large.<br>";
    $ok=0;
}

// This is our limit file type condition
if (!($uploaded_type=="text/java")||!($uploaded_type=="file/class")||! ($uploaded_type=="file/jar")) {
    echo "You may only upload Java files.<br>";
    $ok=0;
}

echo $ok;  //Here we check that $ok was not set to 0 by an error
if ($ok==0) {
    echo "Sorry your file was not uploaded";
}else {
    if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
        echo "The file ". $uploaded ." has been uploaded";
    } else {
        echo "Sorry, there was a problem uploading your file.";
    }
}
?>

您使用的是OR…,这意味着如果其任何成员参数均为TRUE,则整个语句的计算结果为TRUE。由于文件只能是一种类型,因此排除了所有文件。您需要的是“和”匹配:

if (!($uploaded_type == 'text/java') && !($uploaded_type == ....)) {
                                     ^^---boolean and
假设我们使用的是文件/类文件类型,则您的版本为:

if the (file is not text/java) OR the (file is not file/class) OR the (file is not file/jar)
              TRUE                           FALSE                          TRUE

TRUE or FALSE or TRUE -> TRUE
切换到并给你

TRUE and FALSE and TRUE -> FALSE

您的三个条件中只有一个可能为真,因此您最终会:

if (!false || !false || !true)
即:

if (true   || true   || false)
所以您应该使用
&&
来代替
,或者使用更好的函数来检查集合中的多个内容:

if (!in_array($uploaded_type, array("text/java", "file/class","file/jar")) {

因此,如果两个允许的值都找不到,则if将成功。

您可以使用以下方法使其更灵活:

$allowed_types=array(“text/java”、“file/class”、“file/jar”);
if(!in_数组($upload_type,$allowed_type)){
echo“不允许您上载此类文件。
”; $ok=0; }

这使得以后允许更多的文件类型变得非常容易,您只需将其添加到数组中,无需创建太多检查。您甚至可以将允许的类型存储在数据库的配置文件或表中,并动态创建数组
$allowed\u types

有关客户端文件格式限制,请参阅此



难道不能同时使用a和a.java、.class、.jar吗?我使用java,所以我可能是错的!不。布尔逻辑在所有语言中都是一样的。@Hego555您使用的是
非条件和非条件
,这意味着整个子句都不能计算为真。只要它匹配一个,clause的计算结果为FALSE。如果将其更改为
条件或条件
(删除NOTs),则会减少混淆-这将具有相同的效果,并且更具可读性。如果(!in_array($uploaded_type,array(“text/java”,“file/class”,“file/jar”){echo“您只能上载java文件。
”;$ok=0;}仍然给出了错误的文件类型!当发生这种情况时,调试
$upload\u type
包含的内容。MIME类型可能不是您认为的类型。好吧,这是您的实际问题。问题就在那之前。您没有在某个地方分配$upload\t变量。哎呀,我刚才看到mario也提出了这个问题。无论如何,我留下我的答案,因为我觉得它解释得很好。这个问题已经快8岁了,兄弟。
$allowed_types = array("text/java", "file/class", "file/jar");
if(!in_array($uploaded_type, $allowed_types)) {
  echo "You're not allowed to upload this kind of file.<br />";
  $ok = 0;
}