Эта тема на forum.dklab.ru


NOCOMMENT: Класс загрузки файлов на сервер
Я тут долго определялся куда запихнуть темку то ли в Разное ,то ли в склад готовыйх решений.Я написал Класс для загрузки файлов на сервер . Но не покидает ощущение,что сделал плохо. И посоветуйте пожалуйста.Как поправильней контролировать файлы с разным расширением .Что бы небыло загруженно при помощи скрипта файл аля index.jpg.php<?
/*
**Класс file.php
** Описание: Загрузка файлов на сервер
** Версия 0.3
** Созданно 20/11/2005
** Автор: NOCOMMEMT
** Corping (c) NOCOMMENT .All rights reserved
*/

class loadfile
{
var $formname='userfile'; // имя которое используется в форме аля <input type=FILE name=userfile>
var $newname; // новое имя файла без расширения
var $name; // старое имя файла с расширением
var $newdir='/files/'; // новая директория
var $dir; // директория старая
var $mime; // старый майме тип
var $newmime; //новое расширение
var $size; // размер
var $max_file_size='5000000'; //максимальный размер файла
var $id;// id файла
function fileupload()
{
$this->dir=$_FILES[$this->formname]['tmp_name'];
$this->name=$_FILES[$this->formname]['name'];
$this->size=$_FILES[$this->formname]['size'];
$this->mime=$_FILES[$this->formname]['type'];
$this->error=$_FILES[$this->formname]['error'];
//
//
//
// ДАЛЬНЕЙШИЙ КОд нужно поправить под движок
//

if($this->error>0)
{
print 'Проблема: ';
switch($this->error)
{
case 1: return 'Размер файла привышает предельно допустимый';break;
case 2: return 'размер файла больше допустимого';break;
case 3: return 'Загруженна только часть файла';break;
case 4: return 'файл не загружен по неизвестным причинам';break;
}

}
if(!is_uploaded_file($this->dir)) //проверка ,загружен ли файл из формы
{
return "Файл не загружен из формы";
}
if($this->size>$this->max_file_size)
{
return 'Файл имеет недопустимо высокий размер';
}
if(!$this->controlmime())// функция проверяет mime тип(разрешён или нет)
{
return 'Файлы с данным разрешением запрещенны';

}

$this->newfilename();

if(!move_uploaded_file($this->dir,$this->newdir.$this->newname.'.'.$this->newmime))
{

return 'Файл не перемещён из временного каталога';
}
else
{
$filelink=$this->newdir.$this->newname.'.'.$this->newmime;
$query=mysql_query("insert into uploadfiles set fileid='$this->id',filelink='$filelink'");
if(!$query)
{
return 'неудалось записать в базу данных информацию о файле ';
}
else
{

return true;
}
} } //конец функции заливки файла на сервер

function controlmime()
{
if($this->mime=='text/plain')
{
$this->newmime='txt';
return true;
}
return false;

}
function newfilename() // создаёт новое имя
{

$sth=mysql_query("Select max('fileid') from uploadfiles");
list($id) = mysql_fetch_row($sth);
$id=$id+1; //новый id файла
$md5=time()+$id;
$this->newname=md5($md5);


$this->id=$id;

}

} // конец класса
?>
Дмитрий Котеров:
Вы про такую штуку, как отступы в коде, слышали?
Тем, кто отступы не использует, уж точно в Готовых решениях делать нечего, потому что это даже не начальная школа - это ясли. Уж извините за резкость.

Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.
NOCOMMENT:
Есть ещё какие-нибудь замечания по поводу юзибилити этого кода?
Ksnk:
Не думаю, что разумно "добивать" это класс, однако, при постинге кода класса неплохо бы пример использования этого класса, а то сейчас это представляется мне не очень очевидным.
Класс сильно завязан на его "форменную" реализацию, требует наличия опеределенных полей формы. Завязан на определенную структуру базы...
Класс должен быть как рожок в автомате - вставил, передернул затвор и стреляй :) Если его нужно дорабатывать по месту напильником - то скорее всего чего-то не так продумано. Можно посоветовать поискать всякие downloder'ы и файл-мэнеджеры на PHP из библиотек скриптов, к примеру на http://phpclub.ru/?m=app. Мрожет оказаться, что все уже придумано давно ...

Кстати, перед постом кода сюда у него нужно поменять символы табуляции на соответствующее число пробелов. Тогда отступы сохраняются.
NOCOMMENT:
У бд всего два поля
fileid (int авто инкрейент)
filelink (char 100 с)..ссылка на файл
Я писал этот класс для вещей как галереи ,новостные скрипты.ЧТо тут явно не доделанно ,так это мне кажется контролирование расширений. ЧТо бы в скрипте было достаточно написать $file->rashireniya='txt,gif,jpg';
и тд.
Вот пример.

<?
include('file.php');
$file = new loadfile;
$file->nameform='imgfile'; // имя поля
$file->upload();//
// и кримеру нам нужно запихнуть в базу данных ай ди файла,что бы та же новостная лента смогла сослаться на него
// не ссылку просто потому-чтос id егче работать и если нам нужно сменить картинку новости ,достаточно изменить id
print $file->id;

?>

Rumata:
Но не покидает ощущение,что сделал плохо
правильно не покидает

вам сюда для ознакомления
http://pear.php.net/package/HTTP_Upload
http://pear.php.net/packages.php?catpid=7&catname=Database
http://pear.php.net/package/MIME_Type
http://pear.php.net/packages.php?catpid=1&catname=Authentication
Kas-Alex:
Советую Вам еще проверять сам путь(C:windows\system32) загружаемого файла с помощью рег. выражений, а то загрузите хрен знает чего.
Kas-Alex:
рег. выражений
Откоректируюте немного его под свои нужды.
if (!preg_match("/^[(\w\S){1,4}]+\:[(\w\\\.\-\_\s\/)]+\.[(\w)]{1,5}$/", $_POST[$name_variable])){

Эта тема на forum.dklab.ru