Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.02.2016, 08:20
Профессор
Отправить личное сообщение для Гробовщик Посмотреть профиль Найти все сообщения от Гробовщик
 
Регистрация: 10.03.2013
Сообщений: 169

Проверить массив $_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 загружает файлы в алфавитном порядке, а можно ему как то указать в том порядке, что нужно?
Ответить с цитированием
  #2 (permalink)  
Старый 03.02.2016, 12:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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


Не выбирая файлов для загрузки отправьте форму.
Ответить с цитированием
  #3 (permalink)  
Старый 03.02.2016, 13:55
Профессор
Отправить личное сообщение для Гробовщик Посмотреть профиль Найти все сообщения от Гробовщик
 
Регистрация: 10.03.2013
Сообщений: 169

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

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

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

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

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

        )

)
Ответить с цитированием
  #4 (permalink)  
Старый 03.02.2016, 15:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конвертация в массив Alex1233 Общие вопросы Javascript 12 13.05.2015 12:04
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Массив объектов doox911 Библиотеки/Тулкиты/Фреймворки 6 16.01.2014 22:36
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30