Ошибка тестирования при загрузке файлов If в PHP - PullRequest
0 голосов
/ 24 февраля 2019

Это мое первое сообщение о переполнении стека, поэтому, пожалуйста, будьте терпеливы со мной - я прибегнул к публикации, потому что не могу найти ответ через Google / переполнение стека.

Я новичок вPHP и обучение, как добавить загрузку файлов.У меня есть очень простая HTML-форма, которая ведет на страницу PHP.

            <form action="UploadPage.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="100000"/>
            <input type="file" name="uploadedXML"/>
            <input type="submit" value="Upload"/>

Код PHP, который обрабатывает загрузку файла, содержит серию операторов if, чтобы проверить, является ли файл подходящего размера и т. Д. Если естьявляется ошибкой, на странице ошибки генерируется соответствующее сообщение об ошибке.

Я тестировал загрузку файлов различных типов, чтобы убедиться, что операторы ошибок выполняются правильно, и у меня возникают проблемы со вторым (проверьтедля типа файла) и третий (проверьте размер файла).

Если тип файла проверяет, указан ли оператор первым, я нахожу, что если я загружаю файл XML больше максимального размера (100 КБ), я все равнополучить сообщение об ошибке, относящееся к проверке типа файла - когда я должен получить сообщение об ошибке, относящееся к размеру файла.

Однако, если я поменяю местами операторы IF, проверка размера файла будет предшествовать проверке типа файла, если я загружаю неправильный тип файла, но приемлемого размера (например, маленькое изображение), я получаю сообщение об ошибке, относящееся кo файл слишком велик, когда я ожидаю, что файл, относящийся к типу файла, неверен.

<?php

        const UploadKey = 'uploadedXML';
        const AllowedTypes = ['application/xml','text/xml'];

session_start();


/*Checking for errors*/

if (empty($_FILES[UploadKey]['name'])){//check file actually been uploaded
    header("Location: ErrorPage.php"); 
    $_SESSION['errorMessage']="You forgot to add your file!";
    die();
}

if (!in_array($_FILES[UploadKey]['type'],AllowedTypes)){//Check correct type of file
    header("Location: ErrorPage.php"); 
    $_SESSION['errorMessage']="We only accept XML files I'm afraid";
    die();
    }


if ($_FILES[UploadKey]['error'] == 2) {//Check if size too big
header("Location: ErrorPage.php"); 
       $_SESSION['errorMessage']="Your file is too big for us to handle, awkward! Please choose a file under 100KB.";
        die();
       }

$tempFileLoc = $_FILES[UploadKey]['tmp_name'];
$destFileLoc = 'Uploads/'.$_FILES[UploadKey]['name'];

if (file_exists($destFileLoc)) {// Check if file already exists
    header("Location: ErrorPage.php"); 
    $_SESSION['errorMessage']="We've already got this file, thanks though";
    die();
    }

if ($_FILES[UploadKey]['error']>0){
    header("Location: ErrorPage.php"); 
    $_SESSION['errorMessage']="Unfortunately there's been an error with the uploading process";
    die();
    }

Пожалуйста, дайте мне знать, если вам понадобится больше кода, чтобы помочь в ответе.

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Эта проблема возникла из-за MAX_FILE_SIZE, который вы включили в форму HTML.

Если загружаемый вами файл превышает MAX_FILE_SIZE, заданный в форме, PHP автоматически очищает tmp_name и type, а также превращает size в 0 для файла ($ _FILES).

Таким образом, $_FILES[UploadKey]['type'] пусто, поэтому условие, которое вы используете для проверки, разрешен ли тип файла, вернет false.

Чтобы исправить это, вы должны также убедиться, что типтоже не пусто if (!empty($_FILES[UploadKey]['type']) && !in_array($_FILES[UploadKey]['type'],AllowedTypes)

Примерно так:

<?php

  if (!empty($_FILES[UploadKey]['type']) && !in_array($_FILES[UploadKey]['type'],AllowedTypes)){// Make sure the file type is not empty
    header("Location: ErrorPage.php"); 
    $_SESSION['errorMessage']="We only accept XML files I'm afraid";
    die();
  }

0 голосов
/ 24 февраля 2019

Рекомендуется создать массив ошибок и, если он пуст, перейти к следующему шагу или, если нет, вернуть ошибки.Вы можете попробовать что-то вроде этого.В вашем коде вы перезаписывали сообщения об ошибках, поэтому вы видели только последнее, а не все отправленные сообщения могли сработать.

<?php

        const UploadKey = 'uploadedXML';
        const AllowedTypes = ['application/xml','text/xml'];
        $errors = array();

        session_start();


        /*Checking for errors*/
        if (empty($_FILES[UploadKey]['name'])){//check file actually been uploaded
            $errors[] = "You forgot to add your file!";
        }

        if (!in_array($_FILES[UploadKey]['type'],AllowedTypes)){//Check correct type of file
            $errors[] ="We only accept XML files I'm afraid";
         }


        if ($_FILES[UploadKey]['error'] == 2) {//Check if size too big
            $errors[] ="Your file is too big for us to handle, awkward! Please choose a file under 100KB.";      
         }

        $tempFileLoc = $_FILES[UploadKey]['tmp_name'];
        $destFileLoc = 'Uploads/'.$_FILES[UploadKey]['name'];

        if (file_exists($destFileLoc)) {// Check if file already exists
            $errors[] ="We've already got this file, thanks though";
        }

        if ($_FILES[UploadKey]['error'] > 0){
            $errors[] = "Unfortunately there's been an error with the uploading process";
        }

        //if errors were found  
        if(!empty($error)){
            header("Location: ErrorPage.php"); 
            //beware this is now an array and not a single string
            $_SESSION['errorMessage']= $errors;
            die();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...