Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Проверить массив $_FILES (https://javascript.ru/forum/server/61070-proverit-massiv-%24_files.html)

Гробовщик 03.02.2016 08:20

Проверить массив $_FILES
 
Здравствуйте, уважаемые знатоки.
Никогда не думал что запнусь на таком лёгком, казалось бы, вопросе...
В форме есть input file для отправки файлов. Поле не обязательное. На другой странице мы принимаем форму и если файлов нет, то необходимо забить на это.
Однако скрипт упрямо не забивает на массив $_FILES, а пытается его раскрыть и обработать, сопровождая это ошибками. Есть ли какая-то проверка массива $_FILES или обязательно вешать на него гору проверок...
Вот код отправки:
<meta charset="utf-8">
<form action="proba2.php" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" multiple/>
<input type="submit" value="Отправить" />
</p>
</form>

Вот принимающий код:
<?php
echo "<strong>empty</strong><br />";
if (!empty($_FILES['pictures[]'])) { echo "есть файлы<br />"; }
else {echo "нет файлов<br />";}

echo "<strong>sizeof</strong><br />";
if (sizeof($_FILES)!=0) { echo "есть файлы<br />"; }
else {echo "нет файлов<br />";}

echo "<strong>isset</strong><br />";
if (isset($_FILES)) { echo "есть файлы<br />"; }
else {echo "нет файлов<br />";}

echo "<strong>!</strong><br />";
if(!$_FILES) {echo "нет файлов<br />";}
else {echo "есть файлы<br />";}

echo "<strong>count</strong><br />";
if(count ($_FILES['pictures']['name'])>0) {echo "есть файлы<br />";}
else {echo "нет файлов<br />";}

echo "<strong>Первая переменная</strong><br />";
if($_FILES['pictures']['name'][0]=='') {echo "нет файлов<br />";}
else {echo "есть файлы<br />";}

echo "<strong>foreach</strong><br />";
foreach ($_FILES["pictures"]["error"] as $key => $error) {
echo "Раскрыли массив</br>";
    if ($error == UPLOAD_ERR_OK) {
    echo "Чё то делаем с файлами<br />";
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "data/$name");
    }
    else {echo "Не трогаем файлы <br />";}
}
echo "<strong>for</strong><br />";
for ($i=0; $i<count ($_FILES['pictures']['name']); $i++) {
echo "Раскрыли массив</br>";
$filename=end(explode(".", $_FILES['pictures']['name']));
$filename = mb_strtolower($filename);
if ($filename=="jpg" or $filename=="bmp" or $filename=="jpeg" or $filename=="gif") {
    echo "Чё то делаем с файлами<br />";
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "data/$name");
    }
    else {echo "Не правильное расширение .$filename. <br />";}
}
?>

Из всего этого корректно отображает информацию только проверка первой переменной, однако я до конца не уверен, что это правильное решение.
Может кто поделиться опытом???
Ну и второй вопрос для тех кому первый показался лёгким. input file загружает файлы в алфавитном порядке, а можно ему как то указать в том порядке, что нужно?

laimas 03.02.2016 12:06

Это не правильно. Сделайте, для уяснения поведения формы, отдельный скриптик с такой проверкой при отправке формы:

if($_FILES) {
    echo '<pre>';
    print_r($_FILES);
}


Не выбирая файлов для загрузки отправьте форму.

Гробовщик 03.02.2016 13:55

laimas, ну как то так выводит
Array
(
    [pictures] => Array
        (
            [name] => Array
                (
                    [0] => 
                )

            [type] => Array
                (
                    [0] => 
                )

            [tmp_name] => Array
                (
                    [0] => 
                )

            [error] => Array
                (
                    [0] => 4
                )

            [size] => Array
                (
                    [0] => 0
                )

        )

)

laimas 03.02.2016 15:25

И о чем это говорит?

Если при первой загрузке этого теста не выводится массив $_FILES, то это следствие того, что он пуст и условие не выполняется. Но и при отправке формы без выбора файлов этот массив фактически пустой в плане наличия файлов, но тем не менее он уже имеет ключи так как отобразит ошибку загрузки как минимум одного файла.

Если у вас РНР версии не ниже 5, то для того чтобы просто проверить наличие отправленных файлов полем со множественным выбором, можно функцией array_column получить значения ключей tmp_name, вычесть из полученного пустые поля (array_diff) и проверить полученное на наличие данных в этом массиве - если не пуст, значит загружаем. Аналогично можно получить и те файлы, которые загружены с ошибкой, и сразу принять решение.


Часовой пояс GMT +3, время: 05:54.