Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мой класс для работы с файлами 
:(
    Опции темы
mr.Anderson
Дата 17.8.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



а что, класс в духе PHP4 - это плохо? У меня и стоит PHP4. Я не могу писать на другой версии.

Ну, пусть так. Мне нравится. И я буду им пользоваться. Пока просто я не могу написать что-то более сложное.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Vaulter
Дата 18.8.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



приведу свой класс (правда немного заточенный, не суть важно)
и рабочий скрипт
для сравнения
Код

<?php
/**********************************

2006 Vaulter <[email protected]>
part of system :)

**********************************/
//require_once "includes/framework.php";
class cFiles
{
    function upload($inputname,$uploadpath='downloads',$order_id=null,$iswork = false,$comment=null,$type = 0,$onlyarc = true,$filesize = 10000000)
    {
        global $DB,$ts;//need DB to store
        $errormess  = '';//no error
        if(isset($_FILES[$inputname]) && !empty($_FILES[$inputname]['name']))
        {
            $file_up = $_FILES[$inputname];
            if($onlyarc) 
            //check
                if (($file_up['type'] != "application/x-zip-compressed" &&
                        !($file_up['type'] == "application/octet-stream" && stristr($file_up['name'], ".rar") )))
                {
                    @unlink($file_up['tmp_name']);//error handling
                    if(class_exists('cSession')) cSession::addmess('Файл не является архивом');
                    sys_log('Файл '.$file_up['name'].' не является архивом','error',__FILE__,__LINE__);
                    return false;
                }
                
            if ($file_up['size']<$filesize)
            {
                $ext = pathinfo($file_up['name']);
                $ext = $ext['extension'];
                $filename = md5(time().$file_up['name']);//.".".$ext;
                sys_log($filename);
                //check folder. try to create
                if(!is_dir($uploadpath))
                    @mkdir($uploadpath,0711);
                if(!is_dir($uploadpath) || !is_writable($uploadpath))
                {
                    @unlink($file_up['tmp_name']);//error handling
                    if(class_exists('cSession')) cSession::addmess('Папка не доступна. Обратитесь к разработчику');
                    sys_log('Папка не доступна для записи: '.$uploadpath,'error',__FILE__,__LINE__);
                    return false;
                }
                if(!move_uploaded_file($file_up['tmp_name'], "./$uploadpath/$filename"))
                {
                    @unlink($file_up['tmp_name']);//error handling
                    if(class_exists('cSession')) cSession::addmess('Не удалось переместить файл. Обратитесь к разработчику');
                    sys_log('не удалось пеместить файл '.$file_up['tmp_name']." в /$uploadpath/$filename",'error',__FILE__,__LINE__);
                    return false;
                }//do insert into DB
                if(!defined('NODB') && !empty($DB))
                {
                    $idf = $iswork?'work_id':'order_id';
                    /*  `order_id` int(11) default NULL,
                          `work_id` int(11) default NULL , по хорошему, нам нужны связоч. таблицы для каждого случая когда мы 
                                                          используем файлы, например в случае заказов:
                                                          new_files2orders
                                                          file_id, order_id
                                                          для простоты сейчас юзаем поля в таблице файлов
                          `filesize` int(11) NOT NULL default '0',
                          `type` int(11) NOT NULL default '0', /* type - 
                                                            0 - 
                                                            1 -
                          `filename` varchar(255) NOT NULL,оригинальное имя файла 
                          `file` varchar(255) NOT NULL, включая папку 
                          `date` datetime NOT NULL default '0',
                            `comment` text default NULL ,*/
                    $DB->_query(sprintf("INSERT INTO `%s` (`%s`, `filesize`, `filename`, `file`, `date`,`comment`,`type`)
                        VALUES ('%d', '%d', '%s', '%s', NOW(), '%s','%d')",
                        $ts['files'],$idf, $order_id, $file_up['size'], $file_up['name'], $uploadpath."/".$filename, $comment,$type));
                    $file_id = $DB->lastInsertID();
                    return $file_id;
                }
                else
                    return array(
                        "filesize" => $file_up['size'],
                        "filename" => $file_up['name'],
                        "dir" => $uploadpath,
                        "file" => $filename,
                        "type" => $file_up['type']);
                    
                
            }
            else    
            {
                @unlink($file_up['tmp_name']);//error handling
                if(class_exists('cSession')) cSession::addmess('Размер файла превышает максимально допустимый');
                sys_log('размер файла превышает максимально допустимый '.$file_up['name'].' ('.$file_up['size'].')','error',__FILE__,__LINE__);
                return false;
            }
        }
        return false;
    }
    function delete($fid)
    {
        global $DB,$ts;
        if(empty($fid)) return false;//error
        $sql = sprintf("SELECT * FROM `%s` WHERE file_id = '%d'", $ts['files'], $fid);
        $file = $DB->queryRow($sql);
        if(empty($file)) return false;
        //start to delete
        $sql = sprintf("DELETE FROM `%s` WHERE file_id = '%d'",$ts['files'], $fid);
        if(!$DB->_query($sql))
        {
            if(class_exists('cSession')) cSession::addmess('Произошла ошибка удаления записи о файле. Обратитесь к разработчику');
            if(function_exists('sys_log')) sys_log("query failed: $sql",'error');
            return false;
        }
        
        if(!unlink($file['file']))
        {
            if(class_exists('cSession')) cSession::addmess('Произошла ошибка физического удаления файла. Обратитесь к разработчику');
            if(function_exists('sys_log')) sys_log("Unlink failed: $file[file]",'error');
            return false;
        }
        if(class_exists('cSession')) cSession::addmess('Файл был удален');
        return true;
    }
    function formatsize($size)
    {//return with formated string
        if($size > 1024*1024)//more than M
            $ret = sprintf('%.2f Мб',$size/1024/1024);
        elseif($size > 1024)//kB
            $ret = sprintf('%.2f кб',$size/1024);
        else
            $ret = sprintf('%d б',$size);
        return $ret;
    }
}//work with files

?>


и рабочая обертка:
Код

<?php
/**********************************

2006 Vaulter <[email protected]>
part of system :)
files!
**********************************/
define ('FORMS',1);
require_once "includes/framework.php";
$act = sys_fetchvar('act',null,VALID_STRING);
$cnt = sys_fetchvar('cnt',null,VALID_STRING);
//show popup for attach file

switch($act)
{
    case "attach":
    {
        if(!$auth->can('files',ACL_ADD,true))break;
        $oid = sys_fetchvar('oid',null,VALID_NUMBER);
        $wid = sys_fetchvar('wid',null,VALID_NUMBER);
        if(empty($oid) && empty($wid))
        {
            break;
        }
        if(!empty($wid))
        {
            $page = new cHtml('files/form_attach_work');
            $page->build_forms();
            if($page->valid())
            {
                $comment = sys_fetchvar('comment',null,VALID_STRING);
                $file_type = sys_fetchvar('file_type',0,VALID_NUMBER);
                if(cFiles::upload('file', 'files', $wid, true, $comment,$file_type,false))
                {
                    cSession::addmess('Файл был успешно закачан');
                    $page->refresh_parent();
                    $page->close();
                    $page->out();
                    exit;//close() - have to do out and exit???
                }
                else 
                {
                    cSession::addmess('Файл не был закачан');
                    $page->redirect($page->makeurl(true));//to self
                }
            }
        }
        break;
    }
    case "delete":
    {
        $file_id = sys_fetchvar('fid',null,VALID_NUMBER);
        if(!$auth->can('files',ACL_DELETE,true) || empty($file_id)) exit;
        
        $page = new cHtml('files/popup_delete');
        $file = $DB->queryRow(sprintf("SELECT * FROM `%s` WHERE file_id='%d'", $ts['files'], $file_id));
        if(empty($file))
        {
            cSession::addmess('Файл не найден');
            $page->refresh_parent();
            $page->close();
            $page->out();
            exit;
        }
        $page->add('file');
        $page->build_forms();
        if($page->valid())
        {
            $confirm = sys_fetchvar('confirm',false);
            if($confirm)
            {
                cFiles::delete($file_id);
                $page->refresh_parent();
                $page->close();
                $page->out();
            }
            else
            {
                cSession::addmess('Удаление не подтвержденно. Файл не был удален');
                $page->redirect($page->makeurl(true));
            }
        }
        break;
    }
    case "get":
    {//getting file
        $file_id = sys_fetchvar('fid',null,VALID_NUMBER);
        $sql = sprintf("SELECT filename,filesize,file,mime FROM `%s` tf WHERE file_id = '%d'", $ts['files'], $file_id);
        $file = $DB->queryRow($sql);
        if(!empty($file))
        {//echo file
            $fp = @fopen($file['file'],'r');
            if($fp)
            {
                if(!empty($file['mime']))header('Content-type: '.$file['mime']);
                header('Content-Disposition: attachment; filename='.$file['filename']);
                if(!empty($file['filesize']) && $file['filesize'] != -1)
                {
                    header("Accept-Ranges: bytes");
                    header("Content-Length: " . $file['filesize']);
                }
                fpassthru($fp);
                fclose($fp);
                exit;
            }
            else
            {
                cSession::addmess('Ошибка скачивания файла №'.$file_id.' ('.$file['file'].'). Обратитесь к разработчику');

            }
        }
        else
        {
            cSession::addmess('Ошибка скачивания файла №'.$file_id.' ('.$file['file'].'). Обратитесь к разработчику');

        }
    }
}
if($page)
{
    //$page->add('navbar', $navbar->build());
    $page->add('messages',cHtml::GetSessionMessages());
    $page->out('default');
}
else
{
    echo "<h1>Нет \$page</h1>";
    echo "<pre>";print_r(cSession::getmess());echo "</pre>";
}

?>



--------------------
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.