Проверить массив $_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 загружает файлы в алфавитном порядке, а можно ему как то указать в том порядке, что нужно? |
Это не правильно. Сделайте, для уяснения поведения формы, отдельный скриптик с такой проверкой при отправке формы:
if($_FILES) { echo '<pre>'; print_r($_FILES); } Не выбирая файлов для загрузки отправьте форму. |
laimas, ну как то так выводит
Array ( [pictures] => Array ( [name] => Array ( [0] => ) [type] => Array ( [0] => ) [tmp_name] => Array ( [0] => ) [error] => Array ( [0] => 4 ) [size] => Array ( [0] => 0 ) ) ) |
И о чем это говорит?
Если при первой загрузке этого теста не выводится массив $_FILES, то это следствие того, что он пуст и условие не выполняется. Но и при отправке формы без выбора файлов этот массив фактически пустой в плане наличия файлов, но тем не менее он уже имеет ключи так как отобразит ошибку загрузки как минимум одного файла. Если у вас РНР версии не ниже 5, то для того чтобы просто проверить наличие отправленных файлов полем со множественным выбором, можно функцией array_column получить значения ключей tmp_name, вычесть из полученного пустые поля (array_diff) и проверить полученное на наличие данных в этом массиве - если не пуст, значит загружаем. Аналогично можно получить и те файлы, которые загружены с ошибкой, и сразу принять решение. |
Часовой пояс GMT +3, время: 05:54. |