관리-도구
편집 파일: media_control.php
<?php class Media_control { var $mysqli; var $dbpref; var $load; var $base_dir; var $media_dir; var $media_dir_url; var $table; var $types; var $allowed_types; var $allowed_size; function __construct($arr) { $this->mysqli=$arr['mysqli']; $this->dbpref=$arr['dbpref']; $this->load=$arr['load']; $this->table= $this->dbpref.'media'; if(isset($arr['base_dir'])) { $this->base_dir= $arr['base_dir']; } $media_folder= '/assets/media'; $this->media_dir= $this->base_dir.$media_folder; $this->media_dir_url= get_option('install_url').$media_folder; if(!cf_dir_exists($this->media_dir)) { mkdir($this->media_dir); } } function hasFile($file, $get= false) { $file= $this->mysqli->real_escape_string($file); $main_file=$this->media_dir.'/'.$file; $exists= (is_file($main_file))? true: false; $exists_in_db=false; $chk= ($get)? "*": "`id`"; $qry=$this->mysqli->query("select ".$chk." from `".$this->table."` where `file`='".$file."' limit 1"); if($qry->num_rows>0) { $exists_in_db= true; } if($exists && $exists_in_db) { if($get) { $r= $qry->fetch_object(); $r->file_path= $main_file; return $r; } else { return true; } } else if(!$exists && !$exists_in_db) {return false;} else { if($exists_in_db) { $this->mysqli->query("delete from `".$this->table."` where `file`='".$file."'"); } else { unlink($main_file); } return false; } } function getTypes() { return array( 'image'=> array('jpg', 'jpeg' , 'png', 'gif', 'svg'), 'audio'=> array('mp3', 'wma', 'aac', 'wav', 'flac','ogv'), 'video'=> array('flv', 'mp4', 'm3u8', 'ts', '3gp', 'mov', 'avi', 'wmv'), 'document'=> array('doc', 'docx', 'html', 'htm', 'odt', 'pdf', 'xls', 'xlsx', 'ods', 'ppt', 'pptx', 'txt', 'csv', 'zip', 'tar', 'rar'), ); } function doInitInFrontend() { $types=array_keys(self::getTypes()); $types=array_merge(array('all'), $types, array('others')); $arr=array( 'media_url'=> $this->media_dir_url, 'types'=> $types, 'files'=>self::getAssets(), 'max_files_per_page'=> (int)get_option('qfnl_max_records_per_page') ); return $arr; } function getFileType($file) { $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); $type_arr= self::getTypes(); $type='other'; foreach($type_arr as $index=>$types) { if(in_array($ext, $types)) { $type= $index; break; } } return $type; } function verbose($ok=1,$info=""){ // failure to upload throws 400 error if ($ok==0) { http_response_code(400); } die(json_encode(["ok"=>$ok, "info"=>$info])); } function doProcessChunkUpload($file, $destin) { // invalid upload if (empty($_FILES) || $file['error']) { $this->verbose(0, "Failed to move uploaded file."); } // upload destination $filePath = $destin; // dealing with the chunks $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab"); if ($out) { $in = @fopen($file['tmp_name'], "rb"); if ($in) { while ($buff = fread($in, 4096)) { fwrite($out, $buff); } } else { $this->verbose(0, "Failed to open input stream"); } @fclose($in); @fclose($out); @unlink($file['tmp_name']); } else { $this->verbose(0, "Failed to open output stream"); } // check if file was uploaded if (!$chunks || $chunk == $chunks - 1) { rename("{$filePath}.part", $filePath); return 1; } return 0; } function uploadAsset($file) { $temp_title=(isset($_REQUEST['name']))? $_REQUEST['name']:$file['name']; $title=trim($this->mysqli->real_escape_string($temp_title)); $main_type= $file['type']; $size= $file['size']; $tmp_file=$file['tmp_name']; $name=str_replace(' ','_', $title); $count=1; $temp_main_name=$name; lbl: if(self::hasFile($name)) { ++$count; $name_arr=explode('.', $temp_main_name); if(count($name_arr)>1) { $name_arr[count($name_arr)-2] .="(".$count.")"; } $name= implode('.', $name_arr); goto lbl; } $token= get_option('site_token'); $token= 'blob_upload_token_'.$token; if(isset($_SESSION[$token])) { $slug= $_SESSION[$token]; } else { $slug= time(); $_SESSION[$token]= $slug; } $name= $slug.'_'.$name; $destin= $this->media_dir.'/'.$name; //$moved= move_uploaded_file($tmp_file, $destin); $moved= $this->doProcessChunkUpload($file, $destin); if($moved) { require_once("mime_checker/MimeType.php"); if(isset($_SESSION[$token])) {unset( $_SESSION[$token]);} $type=self::getFileType($destin); $size= filesize($destin); $main_type= \MimeType\MimeType::getType($destin); $in=$this->mysqli->query("insert into `".$this->table."` (`title`, `file`, `type`,`file_type`, `size`, `description`, `added_on`, `updated_on`) values ('".$title."', '".$name."', '".$type."','".$main_type."', '".$size."', '', '".time()."', '".time()."')"); if($in) {return 1;} } return 0; } function getAssets($by='all', $page=1) { $mysqli= $this->mysqli; $by= $mysqli->real_escape_string($by); $page=$mysqli->real_escape_string($page); $max= 10 /*(int)get_option('qfnl_max_records_per_page')*/; $page= (int)$page; $page =($page*$max)-$max; $limit_txt= " limit ".$page.",".$max.""; $search=""; if(isset($_POST['do_search'])) { $limit_txt=""; $search=$mysqli->real_escape_string(trim($_POST['do_search'])); $search =str_replace("%", "[%]", $search); $search= str_replace('_', '[_]', $search); $search =" and `title` like '%".$search."%' or `file` like '".$search."'"; } if(isset($_POST['select_order'])) { $order=$mysqli->real_escape_string(trim($_POST['select_order'])); $limit_txt= " order by `id` ".$order.$limit_txt; } $by=($by=='all')? 1: "`type` ='".$by."'"; $qry=$mysqli->query("select * from `".$this->table."` where ".$by.$search.$limit_txt); $arr=array(); while($r= $qry->fetch_object()) { $file=$r->file; unset($r->file); $r->added_on= date('d-M-Y h:ia', $r->added_on); $r->updated_on= date('d-M-Y h:ia', $r->updated_on); $url= get_option('install_url'); $enc_file= cf_enc($file); $ext= ""; $ext_arr= explode('.', $file); if(count($ext_arr)>1 && strlen(trim($ext_arr[count($ext_arr)-1]))>0) { $ext= trim($ext_arr[count($ext_arr)-1]); } $r->url= $url.'/?page=load_media_'.$enc_file.'.'.$ext; $r->file_url= $url.'/assets/media/'.$file; $arr[$file]= $r; } return $arr; } function deleteAsset($file) { $mysqli=$this->mysqli; $file= $mysqli->real_escape_string($file); unlink($this->media_dir.'/'.$file); $mysqli->query("delete from `".$this->table."` where `file`='".$file."'"); } function updateFileBasicData($file, $title, $description, $permission='public') { $mysqli= $this->mysqli; $table= $this->table; $file= $mysqli->real_escape_string($file); $title= $mysqli->real_escape_string($title); $description= $mysqli->real_escape_string($description); $permission= $mysqli->real_escape_string($permission); $up=$mysqli->query("update `".$table."` set `title`='".$title."', `description`= '".$description."', `permission`= '".$permission."' where `file`='".$file."'"); echo (($up)? 1:0); } } ?>