как проверить, установлен ли $ _FILE в php?

#php #file

#php #файл

Вопрос:

Я создал форму с 3 <input type="file"/>

Я вижу, что получаю массив с array(name=>"") .

Поэтому я проверяю if ($_FILE["myfilename"]["name"]=="") вместо этого.

Это работает, но мне кажется довольно необычным.

Мне было интересно, есть ли лучший способ проверить, установлен ли файловый ввод или нет?

Ответ №1:

Существует: is_uploaded_file() . При работе с загруженными файлами вы всегда должны использовать его (и его двоюродного брата move_uploaded_file() ) по соображениям безопасности.

Комментарии:

1. Я в замешательстве по поводу полезности is_uploaded_file . В исходном коде PHP, похоже, существует вторичный хэш. Но значения всегда идентичны тем, что в $_FILES[*]['tmp_name'] . И больше ничего не проверяется. Не уверен, как можно что-то внедрить в $ _FILES во время выполнения скрипта. ( Is_uploaded_file было бы излишним, если вы используете move_uploaded_file , потому что он в любом случае содержит скопированный и вставленный точно такой же тест.)

2. @mario в PHP 4 была уязвимость, с помощью которой мне однажды удалось взломать phpBB друга: в ../config.php можно было ввести пути к локальным файлам (думаю tmp_name ), что привело к копированию этого файла в общедоступный uploads/ каталог или куда угодно. is_uploaded_file() был введен в ответ на это. Существует ли уязвимость по-прежнему, если вы не используете is_uploaded_file() , я не знаю, с тех пор я никогда не проверял

3. Интересно. Значит, это все твоя вина? Голос за взлом отклонен .. ;}

4. Я все еще новичок в концепции загрузки файлов. Итак, если я все правильно понял, когда я нажимаю кнопку загрузки в своей форме, сервер уже загружает файл, следовательно, is_uploaded_file . если is_uploaded_file($_FILES[«имя_путевого поля»]){ move_uploaded_file($_FILE[«имя_путевого поля»],$DestinationFolder) } Это правильно?

5. @ndefontenay последняя часть верна; первая нет: загрузка начинается, когда вы нажимаете кнопку «Загрузить». PHP-скрипт оживает после полной загрузки всех файлов. is_uploaded_file() это просто необычный (и, как сказано выше, повышающий безопасность) способ проверки FILES массива

Ответ №2:

Вы можете использовать empty, чтобы проверить, является ли переменная пустой или нет, но решение Pekka является лучшим в этом отношении

 if (empty($_FILES["myfilename"]["name"]))
  

Если вы проверяете, установлена ли переменная, вы можете использовать функцию isset

Ответ №3:

Лучший способ, предполагающий, что вы используете последнюю версию PHP (4.2 ), — это проверить, что:

 $_FILE['myfilename']['error'] === UPLOAD_ERR_OK
  

Если это правда, загрузка сработала, вы можете увидеть список других возможных значений здесь

Комментарии:

1. вы должны использовать сравнение строгого равенства === . Если вы когда-нибудь введете тип в константу ERR_OK, обычное сравнение выдаст ложное «ok».

2. Очень хорошая отметка, особенно потому, что ее значение равно (int)0.

Ответ №4:

Вы можете попробовать это:

 if($_FILES['myfilename']['size'] > 0 ) {

}
else{
       echo 'File is not uploaded . . .';
}
  

Ответ №5:

Попробуйте это:

 if($_FILES["uploadImg"]['name'][0] != ''){
    //echo 'file attached';
}else{
    //echo 'no file attached';
}
  

У меня это работает…