<?
/**
* @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 " <button name='chdir{$pageid}' class='{$as_cssclass['button']}' onClick='filemgrSetFolder($pageid)' >{$as_iface['chdir']}</button></td></tr>\n";
}
$result = empty($asdt_result[$pageid])? ' ' : $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> ";
}
?>
<button class='button' name='fdelete' onClick='AsAdm_FilemgrDelete(<?=$pageid?>)'><?=$as_iface['delete_files']?></button>
</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> </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>";
}
}
}
}
?>
|