
Эксперт
  
Профиль
Группа: Участник Клуба
Сообщений: 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>"; }
?>
|
|