Login   Register  
PHP Classes
elePHPant
Icontem

File: as_admintool_filemgr.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Alexander Selifonov  >  site administrator tool set  >  as_admintool_filemgr.php  >  Download  
File: as_admintool_filemgr.php
Role: Auxiliary script
Content type: text/plain
Description: Plugin module: file manager
Class: site administrator tool set
Web interface to manage site resources
Author: By
Last change: some changes
Date: 2008-04-20 09:48
Size: 16,309 bytes
 

Contents

Class file image Download
<?
/**
* @package as_admintool
* @desc as_admintool_filemgr.php - File manager plugin (upload/download/delete)
* @author Alexander Selifonov <as-works@narod.ru>
* @copyright Alexander Selifonov 2007
* @link http://as-works.narod.ru/en/php/
* @version 1.001.003
* modified 28.02.2008 (dd.mm.yyyy)
* Read "as_admintool.htm" for detailed instructions
*/
define('ASADM_FILEMGR','filemgr'); // unique string ID for this plugin module
define('ASADM_UPLOADSIZE','1048576'); // upload max file size
define('ASADM_UPLOADFILES',2); // max files to upload per one POST

# Register your plugin !
CAsAdminTool::RegisterPlugin(ASADM_FILEMGR,'AsAdm_filemgr_Form','AsAdm_filemgr_Exec','FileMgr_StdPost');

// interface localization strings
if(empty($as_iface['folder'])) $as_iface['folder'] ='Folder';
if(empty($as_iface['filename'])) $as_iface['filename'] ='File name';
if(empty($as_iface['filesize'])) $as_iface['filesize'] ='Size';
if(empty($as_iface['filetime'])) $as_iface['filetime'] ='Date/time';
if(empty($as_iface['server_reply'])) $as_iface['server_reply'] ='Server reply';
if(empty($as_iface['upload'])) $as_iface['upload'] ='Upload';

// if(!isset($as_iface['chdir'])) $as_iface['chdir'] =''; // empty string - no button to chdir 'Change directory';
if(empty($as_iface['delete_files'])) $as_iface['delete_files'] ='Delete selected files';
if(empty($as_iface['confirm_delete'])) $as_iface['confirm_delete'] ='Selected files will be deleted. Confirm ?';
if(empty($as_iface['upload_files'])) $as_iface['upload_files'] ='Upload file(s)';
if(empty($as_iface['download_files'])) $as_iface['download_files'] ='Download file(s)';
if(empty($as_iface['deleting_error'])) $as_iface['deleting_error'] ='File deleting ERROR !';
if(empty($as_iface['upload_error'])) $as_iface['upload_error'] ='upload ERROR !';

if(empty($as_iface['file_deleted'])) $as_iface['file_deleted'] ='deleted';
if(empty($as_iface['file_uploaded'])) $as_iface['file_uploaded'] ='uploaded';
if(empty($as_iface['file_protected'])) $as_iface['file_protected'] ='File is protected !';
if(empty($as_iface['no_selected_files'])) $as_iface['no_selected_files'] ='No selected files for operation';

$asdt_fmgr_folder = false;
$asdt_fmgr_protect = array(); # protected filenames (can't be deleted or rewritten by upload
/**
* AsAdm_filemgr_Form - function for drawing client interface page (FORM)
* This function will be called when CAsAdmin::Draw() is drawing all pages.
* param1-3 are the parameters You've passed to CAsAdminTool::AddPage()
* @param array $pginfo : [0] - pageid, [1],[2] - parent table size (width,height)
* @param array $param1 pass folder list to work with: [i][0] - real folder, [i][1] - visible title
* @return none
*/
function AsAdm_filemgr_Form($pginfo,$param1=false, $param2=false, $param3=false) {
  global $as_dbengine, $as_iface, $as_cssclass, $asdt_result,$asdt_fmgr_folder;
  $pageid=isset($pginfo[0])? $pginfo[0]: 0;
  $lwidth = isset($pginfo[1])? $pginfo[1]: 800;
  $lheight = isset($pginfo[2])? $pginfo[2]: 600;
  $r_width = $lwidth-20;
  $up_height = ASADM_UPLOADFILES*24 + (ASADM_UPLOADFILES ? 60:0); // height for upload form
  $r_height = max(80, $lheight-195-$up_height); # calculated height of filelist area
  $self = $_SERVER['PHP_SELF'];
  static $js_drawn = false;
  if(!$js_drawn) { #<3> draw only once !!!
    $js_drawn = true;
     ?>
<script language='javascript'>
var ajax_filemgr_busy = false;
var fmgr_folders = [];
var delete_confirm = "<?=$as_iface['confirm_delete']?>";
var fmgr_result = [];
<?
  $result= empty($asdt_result[$pageid]) ? '' : $asdt_result[$pageid];
  echo "fmgr_result[$pageid] = '$result';\n";
?>

function FileMgrChkAll(chkobj,pageid) {
  var fm = asGetObj('asadt_filemgr_'+pageid);
  var chkt = chkobj.checked;
  var els = fm.elements;
  for(i=0; i<els.length; i++)  {
    if(els[i].type=='checkbox' && els[i].name.substring(0,3)=='fl_')
      els[i].checked = chkt;
  }
}
function RefreshFileList(pageid,spl) {
  var sbody = "<tr><td class='<?=$as_cssclass['tdhead']?>'  width=220><?=$as_iface['filename']?></td>";
  sbody += "<td class='<?=$as_cssclass['tdhead']?>' width=120><?=$as_iface['filesize']?></td><td class='<?=$as_cssclass['tdhead']?>'  width=120><?=$as_iface['filetime']?></td>";
  sbody += "<td class='<?=$as_cssclass['tdhead']?>'><input type=checkbox name=chkall onClick='FileMgrChkAll(this,<?=$pageid?>)' value='1'></td>";
  asGetObj('result_'+pageid).innerHTML = spl[1]; // passed action log
  sclass = '<?=$as_cssclass['troweven']?>';
  for(ifl=2;ifl<spl.length;ifl++) {
     finfo = spl[ifl].split('^'); // 0-filename, 1-size, 2-modif-date/time
     if(finfo.length>2) {
       sclass = (sclass=='<?=$as_cssclass['troweven']?>')? '<?=$as_cssclass['trowodd']?>' : '<?=$as_cssclass['troweven']?>';
       sbody +="<tr class='"+sclass+"'><td nowrap><b>"+finfo[0]+'</b></td><td nowrap align=right>'+finfo[1]+'</td>';
       sbody +='<td nowrap align=center>'+finfo[2]+"</td><input type=hidden name='name_"+ifl+"' value='"+finfo[0]+"'><td><input name='fl_"+ifl+"' type='checkbox' value='1'></td></tr>";
     }
  }
  asGetObj('filelist_'+pageid).innerHTML = "<table border=0 cellspacing=1 cellpadding=0>"+sbody+"</table>";
}
function filemgrSetFolder(pageid) {
  if (ajax_filemgr_busy) return;
  var fm = asGetObj('asadt_filemgr_'+pageid);
  isel = fm.folder.selectedIndex;
  foldname = fm.folder.options[isel].value;
  var xmlreq = NewXMLHttpRequest();
  if(!xmlreq) return false;
  ajax_filemgr_busy = true;
  asGetObj('result_'+pageid).innerHTML = '<?=$as_iface['msg_waiting']?>';
  xmlreq.onreadystatechange= function() { //<3>
    if (xmlreq.readyState == 4) { //<3A>
      var resp = xmlreq.responseText;
      var spl = xmlreq.responseText.split("{|}");
      delete xmlreq;
      asGetObj('result_'+pageid).innerHTML = '';
      ajax_filemgr_busy = false;
      if(spl.length < 2 || spl[0].length>10) {
        asGetObj('result_'+pageid).innerHTML ='<?=$as_iface['msg_wrongreply']?> '+"<hr>"+resp;
      }
      else {
        RefreshFileList(pageid, spl);
        asGetObj('result_'+pageid).innerHTML = (fmgr_result[pageid]==undefined ? '': fmgr_result[pageid]);
        fmgr_result[pageid] = '';
      } //<4>
    } //<3A>
  } //<3>

  xmlreq.open('POST','<?=$self?>',true);
  xmlreq.setRequestHeader("Content-Type", postcont);
  params = 'adm_action_type=<?=ASADM_FILEMGR?>&pageid=' + pageid + '&action=chdir&folder='+fm.folder.options[isel].value;
  xmlreq.send(params);
  return false;
}
function AsAdm_FilemgrDelete(pageid) {
  if (ajax_filemgr_busy) return;
  if(!confirm(delete_confirm)) return false;
  var fm = asGetObj('asadt_filemgr_'+pageid);
  var xmlreq = NewXMLHttpRequest();
  if(!xmlreq) return false;
  ajax_filemgr_busy = true;
  asGetObj('result_'+pageid).innerHTML = '<?=$as_iface['msg_waiting']?>';
  xmlreq.onreadystatechange= function() { //<3>
    if (xmlreq.readyState == 4) { //<3A>
      var spl = xmlreq.responseText.split("{|}");
      delete xmlreq;
      ajax_filemgr_busy = false;
      if(spl.length < 2) {
        asGetObj('result_'+pageid).innerHTML ='<?=$as_iface['msg_wrongreply']?> '+spl[0];
      }
      else {
        RefreshFileList(pageid,spl);
      } //<4>
    } //<3A>
  } //<3>

  xmlreq.open('POST','<?=$self?>',true);
  xmlreq.setRequestHeader("Content-Type", postcont);
  params = 'adm_action_type=<?=ASADM_FILEMGR?>&pageid=' + pageid + '&action=delete&'+ComputeParamString('asadt_filemgr_'+pageid);
  xmlreq.send(params);
  return false;
}
function AsAdm_DownloadFile(pageid) {
  var fm = asGetObj('asadt_filemgr_'+pageid);
  var els = fm.elements;
  for(i=0; i<els.length; i++)  {
    if(els[i].type=='checkbox' && els[i].name.substring(0,3)=='fl_' && els[i].checked) {
      // create and open url for downloading file
      var fieldname = 'name_' + els[i].name.substring(3);
      eval('fl_name=fm.'+fieldname+'.value');
      fullname = fm.folder.options[fm.folder.selectedIndex].value + encodeURIComponent(fl_name);
      //alert(fullname);
      var wnd=window.open('<?=$self?>?adm_action_type=filemgr&asadm_download='+fullname, "_blank","height=200,width=600,location=0,menubar=0,resizable=0,scrollbars=0,status=0,toolbar=0,top=40,left=40");
    }
  }
  return false;
}
</script>
<?
  }
?>
<center>
<table id='asadt_tbl_<?=$pageid?>'>
<tr><form name='asadt_filemgr_<?=$pageid?>'>
<input type='hidden' name='your_param1' value='<?=$param1?>'>
<?
  if(is_array($param1)) {
    echo "<tr><td><b>{$as_iface['folder']}</b> <SELECT name='folder' onChange='filemgrSetFolder($pageid)'>";
    for($kf=0;$kf<count($param1);$kf++) {
      $sdir = $stitle = $param1[$kf];
      if(is_array($param1[$kf])) {
        $sdir = $param1[$kf][0];
        $stitle = empty($param1[$kf][1])? $sdir : $param1[$kf][1];
      }
      $sel = ($asdt_fmgr_folder===$sdir ? 'selected':'');
      echo "<OPTION value='$sdir' $sel>$stitle</OPTION>\n";
    }
    echo "</SELECT>\n";
//    if(!empty($as_iface['chdir'])) echo "&nbsp; <button name='chdir{$pageid}' class='{$as_cssclass['button']}' onClick='filemgrSetFolder($pageid)' >{$as_iface['chdir']}</button></td></tr>\n";
  }

  $result = empty($asdt_result[$pageid])? '&nbsp;' : $asdt_result[$pageid];
?>
<tr><td><div id='filelist_<?=$pageid?>' class='<?=$as_cssclass['resultarea']?>' style='overflow:auto; width:<?=$r_width?>px; height:<?=$r_height?>'>files here...<div></td></tr>
<tr><td>
<?
  if(!empty($as_iface['download_files'])) {
    echo "<button name='download' class='button' onClick='AsAdm_DownloadFile($pageid)'>{$as_iface['download_files']}</button> &nbsp;";
  }
?>
<button class='button' name='fdelete' onClick='AsAdm_FilemgrDelete(<?=$pageid?>)'><?=$as_iface['delete_files']?></button> &nbsp;
</td></tr></form></table>
<? if(ASADM_UPLOADFILES >0) { ?>
<hr><div id='asadt_upload_<?=$pageid?>' class='<?=$as_cssclass['resultarea']?>' style='overflow:auto; height:<?=$up_height?>px; width:<?=$r_width?>px; text-align:left'>
<script language="javascript">
function FileMgrUpload(pageid) {
  var fmsrc = asGetObj('asadt_filemgr_'+pageid);
  var fmdest = asGetObj('asadt_upl_'+pageid);
  fmdest.folder.value = fmsrc.folder.options[fmsrc.folder.selectedIndex].value;
//  alert(fmdest.folder.value); return false; // debug
  return true;
}
</script>
<table>
<!-- Form for uploading files to server... -->
<tr><FORM name='asadt_upl_<?=$pageid?>' method='POST' action='<?=$self?>' ENCTYPE="multipart/form-data" >
<input type='hidden' name='adm_action_type' value='<?=ASADM_FILEMGR?>' />
<input type='hidden' name='filemgr_action' value='upload' />
<input type='hidden' name='pageid' value='<?=$pageid?>' />
<input type='hidden' name='as_stdpost' value='1' />
<input type='hidden' name='folder' value='' />
<input type='hidden' name='MAX_FILE_SIZE' value='<?=ASADM_UPLOADSIZE?>' />
<tr><td colspan='2'><b><?=$as_iface['upload_files']?> ...</b></td></tr>
<? for($kup=1; $kup<=ASADM_UPLOADFILES; $kup++) {
    echo "<tr><td width=20><b>$kup</b>:</td><td><input type='FILE' class='{$as_cssclass['textfield']}' name='file{$kup}' style='width:320' /></td></tr>\n";
  }
?>
</tr>
<tr><td>&nbsp;</td><td><input type='SUBMIT' name='submit' class='<?=$as_cssclass['button']?>' onClick='return FileMgrUpload(<?=$pageid?>)' value='<?=$as_iface['upload']?>' /></td></tr>
</form></table></div></center>
<? } ?>

<div align=center>
<table width='98%'>
<tr><td><b><?=$as_iface['server_reply']?></b></td></tr>
<tr><td><div id='result_<?=$pageid?>' class='<?=$as_cssclass['resultarea']?>' style='overflow:auto; height:80px; width:<?=$r_width?>px;'><?=$result?></div></td></tr>
</tr>
</table>
</div>
<?
  if(is_array($param1)) echo "<script language='Javascript'>filemgrSetFolder($pageid);</script>\n";
}

/**
* AsAdm_Filemgr_Exec - function that executes action on server and returns result string.
* @param array $parms, decoded data passes in POST
* @return 'delimited' result. I use a string '{|}' as a delimiter.
*/
function AsAdm_Filemgr_Exec($parms='') {
  global $as_dbengine, $as_iface, $as_admt_bckpfolder, $asdt_result;
  if(!empty($_GET['asadm_download'])) { // download file cmd
    $flname = $_GET['asadm_download'];
    $splt = split("[/\\]",$flname);
    $justfname = $splt[count($splt)-1];
    $fh = fopen($flname,'r');
    $fsize = filesize($flname);

    Header('Pragma: no-cache'); // avoid cached versions
    Header("Pragma: public");
    Header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

    Header('Content-Type: application/octet-stream'); // any binary file
    Header("Content-Length: $fsize");
    Header("Content-Disposition: attachment; filename=\"$justfname\"");
    if($fh>0) { echo fread($fh,$fsize); fclose($fh); }
    exit;
  }
  $pageid = isset($parms['pageid'])? $parms['pageid'] : '1';
  $action = isset($parms['action'])? $parms['action'] : 'chdir';
  switch($action) {
    case 'chdir': # return file list for $folder
      $ret = "$pageid{|}".FlMgr_FileList($parms);
      break;
    case 'delete': #delete some files... $parms["file_<filename>"] = 1
      $ret = "$pageid{|}".FlMgr_DeleteFiles($parms);
  }
  return $ret;
}
function FlMgr_FileList($parms) {
  global $asdt_result;
  $ret = '';
  $folder = isset($parms['folder'])? $parms['folder'] : './';
  $tflist = array();
  if (($handle = @opendir($folder))) {
    while (($file = readdir($handle))) {
      if (is_file($folder.$file)) $tflist[] = $file;
    }
    closedir($handle);
  }
  natsort($tflist); // sort($tflist, SORT_STRING);
  foreach($tflist as $fkey=>$fname) { //$kk=0; $kk<count($tflist);$kk++) {
     $ftime = date ("Y-m-d H:i", filemtime($folder.$fname)); //tflist[$kk]));
     $fsize = number_format(filesize($folder.$fname)); //tflist[$kk]));
     $ret .= "{|}$fname^$fsize^$ftime";
  }
  return $ret;
}
function FlMgr_DeleteFiles($parms) {
  global $asdt_fmgr_protect,$as_iface;
  $folder = isset($parms['folder'])? $parms['folder'] : './';
  $ret = '';
  $dlist = array();
  foreach($parms as $vkey=>$vval) {
    if(substr($vkey,0,3)==='fl_' && $vval=='1') {
      $i = substr($vkey,3);
      $dlist[] = $parms['name_'.$i];
    }
  }
  if(count($dlist)) {
    $msg = '';
    for($kk=0;$kk<count($dlist);$kk++) {
      $msg .= ($msg==''? '':'<br>').$dlist[$kk].' : ';
      if(in_array($dlist[$kk],$asdt_fmgr_protect)) $msg .= $as_iface['file_protected'];
      else
        $msg .= (unlink($folder.$dlist[$kk]) ? $as_iface['file_deleted'] : $as_iface['deleting_error']);
#      $msg .= '<br>'.$dlist[$kk].' '.(true ? ' deleted':' deleting error!');  # emulate, no real seletion! (debug)
    }
    $ret = $msg.FlMgr_FileList($parms); # send new file list after deletion
  }
  else $ret = $as_iface['no_selected_files'].FlMgr_FileList($parms);
  return $ret;
}
/**
* @desc FileMgr_StdPost() standart (non AJAX) POST handling.
* Now used only for uploading files.
*/
function FileMgr_StdPost() {
  global $as_iface, $asdt_fmgr_folder, $asdt_fmgr_protect, $asdt_result;
  $pageid = isset($_POST['pageid'])? $_POST['pageid']: 0;
  $asdt_fmgr_folder = $folder = isset($_POST['folder'])? $_POST['folder']: '';
/*
  $_FILES['fileNN']['name'] - original filename
  $_FILES['fileNN']['tmp_name'] - temp.file path/name
  $_FILES['fileNN']['size'] - file size
  $_FILES['fileNN']['type'] - MIME-type ( "image/gif" )
  $_FILES['fileNN']['error'] - error code
*/
  $asdt_result[$pageid]= '';
  for($kk=1; $kk<=ASADM_UPLOADFILES;$kk++) {
    if(empty($_FILES['file'.$kk]['name'])) { continue; }
    $fl = $_FILES['file'.$kk];
    $to_name = ($folder==='./'?'':$folder) . $fl['name'];
    $tempname = $fl['tmp_name'];
    $errcode = $fl['error'];
    if(!empty($errcode)) {
       $asdt_result[$pageid] .= "{$fl['name']} - upload error: {$fl['error']}<br>";
    }
    else {
      if(in_array($fl['name'],$asdt_fmgr_protect)) {
        # file in 'protected' list, don't upload it!
        $asdt_result[$pageid] .= "{$fl['name']} : {$as_iface['file_protected']}<br>";
        unlink($tempname);
      }
      else {

#        if(@move_uploaded_file($tempname, $to_name) && is_file($to_name)) { // move_uploaded_file sucks ?!
        if(@copy($tempname, $to_name) && is_file($to_name)) {
          $asdt_result[$pageid] .= "$to_name : {$as_iface['file_uploaded']}, (" .number_format(filesize($to_name))." Bytes)<br>";
          @unlink($tempname);
      }
      else  $asdt_result[$pageid] .= "$to_name : {$as_iface['upload_error']} ($errcode)<br>";
      }
    }
  }
}

?>