- Notifications
You must be signed in to change notification settings - Fork 7.6k
simple file browser
Umer Farooq edited this page Dec 18, 2013 · 15 revisions
Feel free to improve it here, but PLEASE fill the 'notes' field below to explain your contribution.
An url like http://www.your-site.com/index.php/browser/**virtual_root**/**path** will allow people to browse directories and files that are under path from absolute_path. You define an absolute_path (in the file system of the server) for a virtual_root with this array
var $roots = array( 'virtual_root' => 'absolute_path', //... ); This may allow us to browse files that are outside your web root, forcing the browsing via CI, and allowing us full control on accesses (not provided for the moment).
- stats for directories and files
- links for sorting directories and files
- clever css markup
- several examples of stylesheets
- bells and hooks and whistles and filters to check accesses
- ...
2009-10-22 - annoted in-code, line 98 of controller, '.$absolute.' changed to $absolute
<?php // may only work if this controller is not in a subfolder class Browser extends Controller { var $roots = array( 'test' => '/home' ); function Browser() { parent::Controller(); // FAL check here } function _remap() { $segment_array = $this->uri->segment_array(); // first and second segments are our controller and the 'virtual root' $controller = array_shift( $segment_array ); $virtual_root = array_shift( $segment_array ); if( empty( $this->roots )) exit( 'no roots defined' ); // let's check if a virtual root is choosen // if this controller is the default controller, first segment is 'index' if ( $controller == 'index' OR $virtual_root == '' ) show_404(); // let's check if a virtual root matches if ( ! array_key_exists( $virtual_root, $this->roots )) show_404(); // build absolute path $path_in_url = ''; foreach ( $segment_array as $segment ) $path_in_url.= $segment.'/'; $absolute_path = $this->roots[ $virtual_root ].'/'.$path_in_url; $absolute_path = rtrim( $absolute_path ,'/' ); // is it a directory or a file ? if ( is_dir( $absolute_path )) { // we'll need this to build links $this->load->helper('url'); $dirs = array(); $files = array(); // let's traverse the directory if ( $handle = @opendir( $absolute_path )) { while ( false !== ($file = readdir( $handle ))) { if (( $file != "." AND $file != ".." )) { if ( is_dir( $absolute_path.'/'.$file )) { $dirs[]['name'] = $file; } else { $files[]['name'] = $file; } } } closedir( $handle ); sort( $dirs ); sort( $files ); } // parent directory // here to ensure it's available and the first in the array if ( $path_in_url != '' ) array_unshift ( $dirs, array( 'name' => '..' )); // send the view $data = array( 'controller' => $controller, 'virtual_root' => $virtual_root, 'path_in_url' => $path_in_url, 'dirs' => $dirs, 'files' => $files, ); $this->load->view( 'browser', $data ); } else { // it's not a directory, but is it a file ? if ( is_file( $absolute_path )) { // let's serve the file header ('Cache-Control: no-store, no-cache, must-revalidate'); header ('Cache-Control: pre-check=0, post-check=0, max-age=0'); header ('Pragma: no-cache'); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); // header('Content-Length: ' . filesize( ".$absolute_path." )); // Modified header('Content-Length: ' . filesize( $absolute_path )); header('Content-Disposition: attachment; filename=' . basename( $absolute_path )); @readfile( $absolute_path ); } else { show_404(); } } } }<h1><?=$virtual_root?></h1> <h2><?='/'.$path_in_url?></h2> <?php $prefix = $controller.'/'.$virtual_root.'/'.$path_in_url; if (!empty($dirs)) foreach( $dirs as $dir ) echo 'd '.anchor($prefix.$dir['name'], $dir['name']).'<br>'; if (!empty($files)) foreach( $files as $file ) echo anchor($prefix.$file['name'], $file['name']).'<br>'; ?>