Ограничения типа файлов PHP - PullRequest
0 голосов
/ 25 октября 2011

Я пробую 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;
}

В основном это не позволяетлюбые файлы, даже те, что там, помогают! Я хочу, чтобы разрешены только файлы 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.";
    }
}
?>

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Вы используете ИЛИ ... это означает, что весь оператор оценивается как ИСТИНА, если ЛЮБОЙ его аргументов-членов являются истинными. Поскольку файл может быть только одного типа, вы исключаете ВСЕ файлы. То, что вы хотите, это совпадение "и":

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

Переключение на AND дает вам

TRUE and FALSE and TRUE -> FALSE
0 голосов
/ 25 октября 2011

Вы можете сделать это более гибким, используя in_array():

$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;
}

Это позволяет очень легко разрешить больше типов файлов в дальнейшем.Если вы хотите разрешить «text / html», вам просто нужно добавить его в массив и не нужно создавать так много проверок.Вы даже можете сохранить разрешенные типы в конфигурационном файле или таблице в базе данных и динамически создавать массив $allowed_types.

0 голосов
/ 25 октября 2011

Только одно из ваших трех условий может быть истинным, так что в итоге вы получите:

if (!false || !false || !true)

Что становится:

if (true   || true   || false)

Так что вы должны либо использовать && вместо OR, или используйте более приятную функцию для проверки нескольких вещей из набора:

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

Так что if будет успешным, если ни из допустимых значений не являетсянайдено.

...