Проверить массив $_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:07. |