Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > проблема с определнием формата файла


Автор: yngwie19 3.2.2010, 08:18
здравствуйте у меня есть форма регистрации, в которой добавлен type=file для загрузки аватара изображения. В скрипте который проверяет правильность заполнения формы регистрации присутствует проверка формата загружаемого изображения:
Код

if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))
{
...
}
else
{
   exit("плохой формат");
}

Когда пробую загрузить например  какой-нибудь левый файл типа .zip объемом 2 mb, то проверка срабатывает и выдается сообщение "плохой формат", а если пробую загрузить zip. к примеру 120mb, то он не доходит до этой проверки а останавливается раньше, там где у меня проверка:
Код

if (isset($_POST['login'])) {$login = $_POST['login'];if ($login == ''){ unset($login);}} 
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password ==''){ unset($password);}}

/*Если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт*/
if (empty($login) or empty($password)) 
    exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");

Подскажите почему так?

Автор: Veve 3.2.2010, 11:10
Что означает: 
Цитата

он не доходит до этой проверки а останавливается раньше


Какое сообщение об ошибке? Или как ты узнаешь, что он там останавливается?

Скорее всего в настройках указан размер файла для upload < 120mb

Автор: yngwie19 3.2.2010, 18:34
Veve, вот скрипт который проверяет регистрационные данные пользователя:
Код

<?php
if (isset($_POST['login'])) {$login = $_POST['login'];if ($login == ''){ unset($login);}} 
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password ==''){ unset($password);}}

/*Если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт*/
if (empty($login) or empty($password)) 
    exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");

if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name'])) //проверка формата исходного изображения
{
     .. //загрузка изображения на сервер
}
else
{
    exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>");
}


если загружаю zip файл размером 9 kb, получаю сообщение  "Аватар должен быть в формате <strong>JPG,GIF или PNG",
а если загружаю zip файл размером 120 mb, то получаю сообщение Вы ввели не всю информацию, вернитесь назад и заполните все поля!.
Т.е во втором случае скрипт не доходит до проверки формата изображения, а говорит что якобы не введены логин и пароль (хотя все введено).

Автор: IgorIV 3.2.2010, 20:41
В самом начале поставь.
Код

$sizeallfiles=120000;    
if ($_SERVER ['CONTENT_LENGTH'] > $sizeallfiles)
{
    echo 'Слишком большое изображение';
}

А если архив .zip переименновать в .jpg и загрузить?

Автор: yngwie19 3.2.2010, 20:57
IgorIV, к сожалению $_SERVER ['CONTENT_LENGTH'] > $sizeallfiles не помогло, та же самая ошибка.

Цитата(IgorIV @  3.2.2010,  20:41 Найти цитируемый пост)
А если архив .zip переименновать в .jpg и загрузить? 

тоже самое.

Может все дело в том что Я тестирую на локальном компе на денвире?

Автор: IgorIV 3.2.2010, 21:58
Да нет же, я неправильно объяснил. Если ты попытаешся загрузить 9 кб файл, с графическим расширением, но с любым содержанием, твой скрипт его пропустит.
Цитата(yngwie19 @  3.2.2010,  18:34 Найти цитируемый пост)
а говорит что якобы не введены логин и пароль (хотя все введено).

На сервер ты послал, а он-то принял? Проверяй.
Цитата(yngwie19 @  3.2.2010,  20:57 Найти цитируемый пост)
IgorIV, к сожалению $_SERVER ['CONTENT_LENGTH'] > $sizeallfiles не помогло, та же самая ошибка.

Разумеется, exit -то нет. Сообщение появилось?

Автор: yngwie19 3.2.2010, 22:21
Цитата(IgorIV @  3.2.2010,  21:58 Найти цитируемый пост)
Да нет же, я неправильно объяснил. Если ты попытаешся загрузить 9 кб файл, с графическим расширением, но с любым содержанием, твой скрипт его пропустит.

да но как пропускает, он по крайней мере говорит, что файл не того формата.

Цитата(IgorIV @  3.2.2010,  21:58 Найти цитируемый пост)
На сервер ты послал, а он-то принял? Проверяй.

не доходит до этой строчки.

Автор: IgorIV 4.2.2010, 21:10
Цитата(yngwie19 @  3.2.2010,  22:21 Найти цитируемый пост)
не доходит до этой строчки.

 smile 
var_dump($_POST);
Тебя никто не заставляет писать exit. Естественно после него ничего не выводится, скрипт прекращает работу.
По сути, твои 120 мб больше разрешённых. Сервер обрывает передачу и никаких данных нет.

Автор: capitan 5.2.2010, 15:02
yngwie19,  Кто же так проверяет допустимые расширения? Может не стоит с самого начала писать дырявый скрипт?

Можно посмотреть в такую сторону:
Код

if($_FILES['fupload']['type'] != "image/gif") {
   echo "Sorry, we only allow uploading GIF images";
   exit;
 }


Но эту проверку тоже можно обойти, но уже сложнее. Немного погуглив можно найти правильное решение.


Автор: TName 7.2.2010, 13:01
если сильно напрягает, что ошибка не та вылазит, когда файл большой, то иди в php.ini и там
Код

upload_max_filesize = какой_тебе_надо_размер;

А вобще http://ru.php.net/manual/en/features.file-upload.php всё понятно расписано откуда ноги растут.

P.S. С английским надо дружить. Хотя бы читать.

Автор: Photon 11.2.2010, 00:02
А может проще вообще использовать js-скрипт, который будет проверять это еще на клиенте?
Например jQuery MultiFile - удобная штука

А в данном случае всё происходит от того, что веб-сервер сначала получает полностью все загружаемые данные, а потом передаёт их в PHP для обработки. Если размер файла больше, чем максимальный размер POST-данных, разрешённый у PHP (там есть два параметра: upload_max_filesize и post_max_size), то PHP считает, что ему вообще ничего не пришло (в том числе и логин с паролем).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)