#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';
}
У меня это работает…