собственно форма: PHP: <form enctype="multipart/form-data" action="upload.class.php" method="post"> <input type="file" name="filename" size="45"> <input type="submit" value=" Грузить! " name="upload"> </form> <?php if(isset($_FILES['file'])){ include"upload.class.php"; $upload_class= new file_upload(); $upload_class->file_server_patch="uploads"; $upload_class->file_extended = array(".jpg", ".gif", ".png"); // Типы файлов передающиеся ядру на обработку $upload_class->file_info = $_FILES['file']; // Инфо о файле $upload_class->file_new_name = dirname (__FILE__).$upload_class->file_server_patch; // Имя файла не изменное $upload_class->file_size=70000000; // Вызываем метод загрузки файла $upload_class->file_upload_data(); unset($upload_class); } и сам класс: PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); class file_upload { public $file_info = array(); // Массив с информацией о исходном файле - $_FILES['file_name'] public $file_server_patch = ""; //Путь по которому на сервере хранятся закачанные файлы # по умолчанию кидаем в корень public $file_new_name = ""; //Новое имя файла (то под каки он будет лежать на сервере # при пустом значении то имя с которым файл был передан public $file_max_size = 0; // Максимально допустимый размер закачиваемого на сервер файла # При пустом значении размер передаваемого файла public $file_extended = array(); // Массив с допустимыми для закачиваемого файла расширениями # пустой массив берем расширение исходного файла public $rezult_array = array(); // Массив возвращаемых значений public $file_size = ""; // Размер файла public $s = 0; // Номер файла от начала public $d = @opendir($file_server_patch); // Открыть директорию загрузки public $upload_link = ""; // Генерируемая ссылка public function file_upload_data() { $this->file_size = $file_size; $this->file_info = $file_info; $this->file_extended = $file_extended; $this->file_server_patch = $file_server_patch; $this->s = $s; if($this->file_size < $this->file_info['size']) { if($this->file_extended != $this->file_info['type']) { $d=@opendir($this->file_server_patch); $this->s; while($e=readdir($d)) { if(is_file($this->file_server_patch."/".$e)) $this->s++; } } else { echo"Не разрешенный тип файла!<br>"; echo"<a href="index.php?microtime();">Загрузить еще</a>"; } } else { echo"Размер файла превышает лимит!<br>"; echo"<a href="index.php?microtime();">Загрузить еще</a>"; } private function file_upload() { $this->file_new_name = $file_new_name; $this->upload_link = $upload_link; if(move_uploaded_file($this->file_info['tmp_name'], $this->file_server_patch.$this->file_new_name)) { include"../style/echo.tpl" echo "<a href='?".md5(microtime())."'>Загрузить другой файл</a>"; } else { echo"Не удалось загрузить файл"; } } ?> выбираю файл, жму загрузку, выдает белую страницу, вывод ошибок как видите есть, но ничего не выводит, подскажите где я ошибся? это один из первых моих написанных классов
да я написал же что я новичок, допустил грубую ошибку, класс забыл закрыть... но это проблему не решило, пожет что то не так передаю?
PHP: <?php public function file_upload_data() { $this->file_size = $file_size; $this->file_info = $file_info; $this->file_extended = $file_extended; $this->file_server_patch = $file_server_patch; $this->s = $s; ... } Это что за бред? Да и вообще установка всех параметров должна идти через методы, а не через паблик переменные класса
опять пост ТС не до конца дочитал лучше займитесь процедурным программированием, а то с вашим классом вас тут палками забьют ;d
ребят кроме поливания га*вном меня есть какое нибудь решение? за код сказали, что это более мнение для новичка, так что не вижу смысла это высказывать в я яркой форме...
В атрибуте action тега form нужно писать не upload.class.php, а название того скрипта, который принимает и обрабатывает файл. То есть того скрипта, в котором написано вот это: PHP: <?php if(isset($_FILES['file'])) { include "upload.class.php"; // ... ?>
все зделал так как посоветовал, то же самое но уже в скрипте обработке: PHP: <?php if(isset($_FILES['file'])) { и т.п.
Ты забыл закрыть не только класс, но также и метод file_upload_data() - т.е. не хватает двух закрывающих фигурных скобок. Вот этот блок в начале метода file_upload_data() действительно не нужен: PHP: <?php // ... $this->file_size = $file_size; $this->file_info = $file_info; $this->file_extended = $file_extended; $this->file_server_patch = $file_server_patch; $this->s = $s; // ... Он обнулит все перечисленные в нём внутренние переменные класса, поскольку переменные $file_size, $file_info и т.д. внутри метода не заданы. И необходимости в этом блоке кода нет, так как переменные у тебя public и ты задаёшь им значения явно в скрипте, который использует класс. Например, вот одна из строк, задающих значения: PHP: $upload_class->file_server_patch="uploads"; Чтобы иметь возможность задать параметр $s при вызове метода - упомяни тогда в объявлении метода об этой переменной: PHP: <?php // ... public function file_upload_data($s = 0) { // ... } // ... ?> Из-за недостающих фигурных скобок, PHP не может разобрать файл class.upload.php , т.е. тут синтаксическая ошибка. Файлы, в которых есть синтаксическая ошибка PHP не выполняет вообще, в том числе и всё то, что выше того места, где ошибка. Т.е. инструкции: PHP: <?php // ... ini_set('display_errors',1); error_reporting(E_ALL); не выполняются. Помести эти инструкции в основной файл, который инклудит файл с классом. Где-то в начале, на следующей строчке после первого <?php Вот ещё ошибочка: $upload_class->file_server_patch="uploads"; $upload_class->file_new_name = dirname (__FILE__).$upload_class->file_server_patch; функция dirname() убирает не только название файла на конце, но и последний слэш. Т.е. писать надо как-то так: $upload_class->file_new_name = dirname (__FILE__) . DIRECTORY_SEPARATOR . $upload_class->file_server_patch;
Исправил все: PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); class file_upload { public $file_info = array(); // Массив с информацией о исходном файле - $_FILES['file_name'] public $file_server_patch = "/"; //Путь по которому на сервере хранятся закачанные файлы # по умолчанию кидаем в корень public $file_new_name = ""; //Новое имя файла (то под каки он будет лежать на сервере # при пустом значении то имя с которым файл был передан public $file_max_size = 0; // Максимально допустимый размер закачиваемого на сервер файла # При пустом значении размер передаваемого файла public $file_extended = array(); // Массив с допустимыми для закачиваемого файла расширениями # пустой массив берем расширение исходного файла public $rezult_array = array(); // Массив возвращаемых значений public $file_size = ""; // Размер файла /*public $s = 0;*/ // Номер файла от начала public $d = @opendir($file_server_patch); // Открыть директорию загрузки public $upload_link = ""; // Генерируемая ссылка public function file_upload_data($s = 0) { if($this->file_size < $this->file_info['size']) { if($this->file_extended != $this->file_info['type']) { $d=@opendir($this->file_server_patch); $this->s; while($e=readdir($d)) { if(is_file($this->file_server_patch."/".$e)) $this->s++; } } else { echo"Не разрешенный тип файла!<br>"; echo"<a href="index.php?microtime();">Загрузить еще</a>"; } } else { echo"Размер файла превышает лимит!<br>"; echo"<a href="index.php?microtime();">Загрузить еще</a>"; } } private function file_upload() { $this->file_new_name = $file_new_name; $this->upload_link = $upload_link; if(move_uploaded_file($this->file_info['tmp_name'], $this->file_server_patch.$this->file_new_name)) { /*include"../style/echo.tpl"*/ echo "Загрузить другой файл"; } else { echo"Не удалось загрузить файл"; } } } ?> обработчик PHP: <?php if(isset($_FILES['file'])){ include"upload.class.php"; $upload_class= new file_upload(); $upload_class->file_server_patch="uploads"; $upload_class->file_extended = array(".jpg", ".gif", ".png"); // Типы файлов передающиеся ядру на обработку $upload_class->file_info = $_FILES['file']; // Инфо о файле $upload_class->file_new_name = dirname (__FILE__) . DIRECTORY_SEPARATOR . $upload_class->file_server_patch; // Имя файла не изменное $upload_class->file_size=70000000; // Вызываем метод загрузки файла $upload_class->file_upload_data(); unset($upload_class); } ?> форма PHP: <form enctype="multipart/form-data" action="form.php" method="post"> <input type="file" name="filename" size="45"> <input type="submit" value=" Грузить! " name="upload"> </form> все равно в чем то беда...
Слушай, я думал попробовать тебе помочь, скопировал твой код, запустил, начал править/разбираться... но тут косяк на косяке. Для начала в форме у тебя HTML: <input type="file" name="[b]filename[/b]" size="45"> а в обработчике PHP: if(isset($_FILES['[b]file[/b]'])){ Нужно, чтобы в форме и в обработчике названия совпадали. size="45" - там нафиг не нужен. По поводу путей и названия файла. В примере выше я просто написал, как это может быть. Вообще если подумать, то нужно сделать так, чтобы путь к каталогу для сохранения файлов был правильным абсолютным путём. Например, так: PHP: $upload_class->file_server_patch = dirname(__FILE__) . DIRECTORY_SEPARATOR . "uploads"; Название файла - можешь использовать исходное, если хочешь (то, которое было у пользователя, который загрузил файл). Однако тут нужно подумать, что делать, если кто-то загрузил файл с таким же названием файла, как у какого-то другого пользователя, который загрузил файл раньше. Можно переименовывать, можно создавать новую папку или выводить сообщение об ошибке и просить пользователя дать новое название файлу (последнее - бред, конечно). Так можно использовать просто исходное название файла, которое было у пользователя, загружающего файл: PHP: $upload_class->file_new_name = $_FILES['filename']['name']; Соответственно, в самом классе (когда копируешь файл) соединяешь путь к файлу с названием файла, но между ними нужно вставить разделитель путей, используемый в той или иной ОС: PHP: <?php // ... if(move_uploaded_file($this->file_info['tmp_name'], $this->file_server_patch . DIRECTORY_SEPARATOR . $this->file_new_name)) // ... Важный момент, который ты не учитываешь. Или не знаешь о нём. Или не понимаешь, что значат эти слова. В общем у классов есть методы-конструкторы. Допустим, ты создаёшь класс так: PHP: <?php class className { private $someVar; public function functionName() { // some code here } } ?> Так вот, если у тебя название класса className и название метода functionName одинаковы, то считается, что данный метод является методом-конструктором. Это старый синтаксис, сейчас принято методы-конструкторы называть словом __construct() , но, тем не менее, для совместимости новых версий php со старыми скриптами этот синтаксис по-прежнему поддерживается. В твоём коде класс имеет название file_upload и метод, который загружает файл имеет такое же название: PHP: private function file_upload() Т.е. получается, что ты объявляешь его методом-конструктором. Но сразу возникает ряд косяков. Во-первых, конструктор не может быть private, поскольку он ВСЕГДА вызывается из внешнего кода, а не из самого класса. Только public. Ну а во-вторых... Конструктор всегда запускается в момент создания экземпляра класса (объекта). Т.е. вот ты написал в коде: PHP: $upload_class= new file_upload(); Всё! В этот момент конструктор уже выполнился. Он выполняется сразу, как только ты создаёшь объект из класса. А теперь смотри, что происходит. У тебя конструктор копирует загруженный файл в какую-то новую папку. Но он ещё НЕ знает, какое ты хочешь название файла, в какую папку ты хочешь скопировать, какие допустимы разрешения, какой должен быть размер файла и пр. Ведь сперва же создаётся класс, а потом уже указываются все эти значения - пути, названия и пр. Но указывается всё это, выходит, уже после того, как метод-конструктор, который согласно твоему коду должен быть скопировать файл, отработал. Это понятно? Но это ещё далеко не всё. Смотри, в первых строках метода file_upload() (который является конструктором класса file_upload) ты пишешь: PHP: $this->file_new_name = $file_new_name; $this->upload_link = $upload_link; Но при этом данный метод НЕ принимает никаких входящих параметров. Слова global (для того, чтобы получить доступ к "внешним" для метода переменным - тоже нет. Соответственно, внутри этого метода переменных $file_new_name и $upload_link - не существует. И когда выполняются эти 2 строчки кода, то значения $this->file_new_name и $this->upload_link становятся равными значению null (которое может интерпретироваться по-разному в зависимости от контекста: обычно это либо false, либо пустая строка, либо число 0). А на следующей строчке ты пишешь: PHP: <?php // ... move_uploaded_file($this->file_info['tmp_name'], $this->file_server_patch.$this->file_new_name) Поскольку данный метод является методом-конструктором, и переменные класса ещё имеют значения по-умолчанию (которые ты сам прописываешь в первых строках класса), то они и будут использованы. Ведь конструктор выполняется ДО всех обращений к объекту. То есть ДО вот этого: PHP: <?php // ... $upload_class->file_server_patch = "uploads"; $upload_class->file_extended = array(".jpg", ".gif", ".png"); // и т.д... Таким образом, $this->file_info равна просто пустому массиву (поскольку ты в начале класса пишешь public $file_info = array();), $this->file_server_patch будет равна слэшу (в начале ты пишешь: public $file_server_patch = "/";) ну и $this->file_new_name будет равна значению null, поскольку ты в первой строке метода file_upload() сам это значение, по сути получается, сбрасываешь, даже если бы оно и было. Итого мы получаем такую конструкцию: PHP: move_uploaded_file(null, "/"); Естественно, это ничего никуда не скопирует. Но и сейчас по-прежнему не всё. Посмотри на то, как ты генерируешь ссылки при возникновении ошибок: PHP: <?php // ... echo"<a href="index.php?microtime();">Загрузить еще</a>"; Тут сразу как минимум два косяка в одной строке кода: Во первых ты используешь одинаковые кавычки. В начале первая двойная кавычка после слова echo начала текстовую строку. Но уже через несколько букв у тебя снова появляется двойная кавычка, после символа =, который следует после атрибута href. В этом месте - всё, строка закрылась. То, что идёт дальше - уже не является строкой текста, а расценивается, как часть кода программы. Для того, чтобы написать символ двойной кавычки внутри строки, объявленной с помощью двойных кавычек - нужно экранировать все "внутристроковые" двойныек кавычки. Например так: PHP: <?php // ... echo "<a href=\"index.php?microtime();\">Загрузить еще</a>"; Также можно обрамить строку одинарными кавычками. Тогда двойные кавычки внутри строки будет не обязательно экранировать: PHP: <?php // ... echo '<a href="index.php?microtime();">Загрузить еще</a>'; Ну а второй косяк в том, что ты пытаешься вписать функцию microtime() прямо в строку символов. Не выйдет. Чтобы встроить в строку значение, которое возвращает функция, нужно выполнить конкатенацию строк (склеить строки): PHP: <?php // ... echo "<a href=\"index.php?" . microtime() . "\">Загрузить еще</a>"; Ну и ещё косячёк в начале класса при объявлении переменных: PHP: public $d = @opendir($file_server_patch); Вообще тут я не знаю точно, но у меня это вызывало ошибку. При объявлении переменной $d можешь вообще никакого значения ей не присваивать, а директорию открывай уже внутри какого-нибудь метода. Это так, то что я нашёл за то время, которое попробовал разобраться с твоим кодом. Естественно, не факт, что это все ошибки, которые там есть. Это лишь те, которые я заметил. И напоследок: внимательно, от начала и до конца прочитай главу "Введение в объектно-ориентированное программирование" какой-нибудь книги по PHP 5, а также главу, в которой говорится об области видимости переменных. Это самый минимум, который нужен тебе для понимания того, что ты сам сейчас накодил. И да, перенеси, наконец, PHP: ini_set('display_errors',1); error_reporting(E_ALL); в основной файл, который вызывается, когда отправляешь заполненную форму (я так понимаю, что это form.php). Как я и писал выше, вставь это после первого <?php
спасибо за подсказки, вот подправил как понял: PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); class file_upload { public $file_info = array(); // Массив с информацией о исходном файле - $_FILES['file_name'] public $file_server_patch = "/"; //Путь по которому на сервере хранятся закачанные файлы # по умолчанию кидаем в корень public $file_new_name = ""; //Новое имя файла (то под каки он будет лежать на сервере # при пустом значении то имя с которым файл был передан public $file_max_size = 0; // Максимально допустимый размер закачиваемого на сервер файла # При пустом значении размер передаваемого файла public $file_extended = array(); // Массив с допустимыми для закачиваемого файла расширениями # пустой массив берем расширение исходного файла public $rezult_array = array(); // Массив возвращаемых значений public $file_size = ""; // Размер файла /*public $s = 0;*/ // Номер файла от начала /*public $d = @opendir($file_server_patch);*/ // Открыть директорию загрузки public $upload_link = ""; // Генерируемая ссылка public function file_upload_data($s = 0) { if($this->file_size < $this->file_info["size"]) { if($this->file_extended != $this->file_info["type"]) { $d=@opendir($this->file_server_patch); /*$this->s;*/ while($e=readdir($d)) { if(is_file($this->file_server_patch."/".$e)) $this->s++; } } else { echo"Не разрешенный тип файла!<br>"; echo"<a href='index.php?'>Загрузить еще</a>"; } } else { echo"Размер файла превышает лимит!<br>"; echo"<a href='index.php?'>Загрузить еще</a>"; } } public function file_upload() { global $file_new_name, $upload_link; $this->file_new_name = $file_new_name; $this->upload_link = $upload_link; if(move_uploaded_file($this->file_info["tmp_name"], $this->file_server_patch.$this->file_new_name)) { /*include"../style/echo.tpl"*/ echo "Загрузить другой файл"; } else { echo"Не удалось загрузить файл"; } } } ?> обработчик PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); if(isset($_FILES['filename'])){ include"upload.class.php"; $upload_class = new file_upload(); $upload_class->file_server_patch="uploads"; $upload_class->file_extended = array(".jpg", ".gif", ".png"); // Типы файлов передающиеся ядру на обработку $upload_class->file_info = $_FILES['filename']; // Инфо о файле $upload_class->file_server_patch = dirname(__FILE__) . DIRECTORY_SEPARATOR . "uploads"; // Имя файла не изменное $upload_class->file_size=70000000; // Вызываем метод загрузки файла $upload_class->file_upload_data(); unset($upload_class); } ?> выдает ошибку Notice: Undefined index: tmp_name in /var/www/learn/upload.class.php on line 59 хотя этот параметр должен передаваться, идет перемещение из временной папки