app/libraries/FileManager.php (178 lines of code) (raw):

<?php class FileManager { /** * returns a json message ether successful or failure. */ public static function msg($status, $msg) { return json_encode(array( 'status' => $status, 'msg' => $msg )); } /** * Takes a given path and prints the content in json format. */ public static function get_content($dataRoot, $path) { $path = $dataRoot . $path; $path = rtrim($path, '/'); // get dir content $files = array(); $folders = array(); FileManager::list_dir($path, $files, $folders); $files = array_merge($folders, $files); // get info foreach ($files as $k => $v) { $i = FileManager::get_file_info($v['path'], array( 'name', 'size', 'date', 'fileperms' )); if ($v['folder']) { $files[$k] = array ( 'name' => $i['name'], 'size' => '---', 'date' => date('Y-m-d H:i:s', $i['date']), 'perm' => FileManager::unix_perm_string($i['fileperms']), 'folder' => True ); } else { $files[$k] = array( 'name' => $i['name'], 'size' => FileManager::human_filesize($i['size']), 'date' => date('Y-m-d H:i:s', $i['date']), 'perm' => FileManager::unix_perm_string($i['fileperms']), 'folder' => False ); } $files[$k]['link'] = str_replace($dataRoot, '', $v['path']); } return json_encode(array('status' => 'ok', 'files' => $files)); } /** * returns html to build a breadcrumb based upon path. * path should look like this: page/subdir/gfx */ public static function breadcrumb($path) { $parts = explode('/', $path); $html = ''; $link = ''; for ($i = 0; $i < count($parts); $i++) { if ($i != count($parts) - 1) { $link .= $i == 0 ? $parts[$i] : '/'.$parts[$i]; $html .= "<li><a href=\"$link\">".$parts[$i].'</a></li>'; } else { $html .= '<li class="active">'.$parts[$i].'</li>'; } } return "<ol class=\"breadcrumb\">$html</ol>"; } /** * stores files and folders of given directory in the provided arrays. */ private static function list_dir($path, &$files, &$folders) { foreach (scandir($path) as $f) { if ($f == '.' || $f == '..') continue; $file = array( 'name' => $f, 'path' => "$path/$f", ); if (is_dir($file['path'])) { $file['folder'] = true; $folders[] = $file; } else { $file['folder'] = false; $files[] = $file; } } } /** * create thumbnail. will return false on failure. */ private static function create_thumbnail($picture, $picture_thumb, $w) { // get src image if (pathinfo($picture, PATHINFO_EXTENSION) == "jpg") $source_image = imagecreatefromjpeg($picture); else if (pathinfo($picture, PATHINFO_EXTENSION) == "png") $source_image = imagecreatefrompng($picture); else return false; $width = imagesx($source_image); $height = imagesy($source_image); // calc height according to given width $h = floor($height * ($w / $width)); // create virtual $virtual_image = imagecreatetruecolor($w, $h); // copy src image imagecopyresized($virtual_image, $source_image, 0, 0, 0, 0, $w, $h, $width, $height); // create thumbnail if (pathinfo($picture, PATHINFO_EXTENSION) == 'jpg') imagejpeg($virtual_image, $picture_thumb, 83); elseif (pathinfo($picture, PATHINFO_EXTENSION) == 'png') imagepng($virtual_image, $picture_thumb); return true; } /** * returns a password hash. */ private static function generate_hash($pass, $salt) { return hash('sha256', $pass.$salt); } /** * returns a random salt. */ private static function generate_salt() { mt_srand(microtime(true) * 100000 + memory_get_usage(true)); return uniqid(mt_rand(), true); } /** * Takes a file size in bytes and returns a human readable filesize. */ private static function human_filesize($bytes, $decimals = 2) { $sz = 'BKMGTP'; $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor]; } /** * Takes an permission value and builds a human readable unix style permission * string. * Taken from php.net. */ private static function unix_perm_string($perms) { if (($perms & 0xC000) == 0xC000) { // Socket $info = 's'; } elseif (($perms & 0xA000) == 0xA000) { // Symbolic Link $info = 'l'; } elseif (($perms & 0x8000) == 0x8000) { // Regular $info = '-'; } elseif (($perms & 0x6000) == 0x6000) { // Block special $info = 'b'; } elseif (($perms & 0x4000) == 0x4000) { // Directory $info = 'd'; } elseif (($perms & 0x2000) == 0x2000) { // Character special $info = 'c'; } elseif (($perms & 0x1000) == 0x1000) { // FIFO pipe $info = 'p'; } else { // Unknown $info = 'u'; } // Owner $info .= (($perms & 0x0100) ? 'r' : '-'); $info .= (($perms & 0x0080) ? 'w' : '-'); $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); // Group $info .= (($perms & 0x0020) ? 'r' : '-'); $info .= (($perms & 0x0010) ? 'w' : '-'); $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); // World $info .= (($perms & 0x0004) ? 'r' : '-'); $info .= (($perms & 0x0002) ? 'w' : '-'); $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); return $info; } /** * Returns information about a given file. * Taken from code igniter. */ private static function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) { if (!file_exists($file)) { return FALSE; } if (is_string($returned_values)) { $returned_values = explode(',', $returned_values); } foreach ($returned_values as $key) { switch ($key) { case 'name': $fileinfo['name'] = substr(strrchr($file, DIRECTORY_SEPARATOR), 1); if( $fileinfo['name'] == false) $fileinfo['name'] = substr(strrchr($file, "/"), 1); break; case 'server_path': $fileinfo['server_path'] = $file; break; case 'size': $fileinfo['size'] = filesize($file); break; case 'date': $fileinfo['date'] = filemtime($file); break; case 'readable': $fileinfo['readable'] = is_readable($file); break; case 'writable': // There are known problems using is_weritable on IIS. It may not be reliable - consider fileperms() $fileinfo['writable'] = is_writable($file); break; case 'executable': $fileinfo['executable'] = is_executable($file); break; case 'fileperms': $fileinfo['fileperms'] = fileperms($file); break; } } return $fileinfo; } }