• Main Page
  • Modules
  • Classes
  • Files
  • File List

pages/manager/FilesHandler.inc.php

00001 <?php
00002 
00016 import('pages.manager.ManagerHandler');
00017 
00018 class FilesHandler extends ManagerHandler {
00022    function FilesHandler() {
00023       parent::ManagerHandler();
00024       $this->addRoleAssignment(ROLE_ID_PRESS_MANAGER,
00025             array('fileDelete', 'fileMakeDir', 'files', 'fileUpload'));
00026    }
00027 
00033    function files($args, &$request) {
00034       $this->setupTemplate(true);
00035 
00036       import('lib.pkp.classes.file.PrivateFileManager');
00037       $privateFileManager = new PrivateFileManager();
00038 
00039       $this->_parseDirArg($args, $currentDir, $parentDir);
00040       $currentPath = $this->_getRealFilesDir($request, $currentDir);
00041 
00042       if (@is_file($currentPath)) {
00043          $privateFileManager->downloadFile($currentPath, null, (boolean) $request->getUserVar('download'));
00044       } else {
00045          $files = array();
00046          if ($dh = @opendir($currentPath)) {
00047             while (($file = readdir($dh)) !== false) {
00048                if ($file != '.' && $file != '..') {
00049                   $filePath = $currentPath . '/'. $file;
00050                   $isDir = is_dir($filePath);
00051                   $info = array(
00052                      'name' => $file,
00053                      'isDir' => $isDir,
00054                      'mimetype' => $isDir ? '' : $this->fileMimeType($filePath),
00055                      'mtime' => filemtime($filePath),
00056                      'size' => $isDir ? '' : $fileManager->getNiceFileSize(filesize($filePath)),
00057                   );
00058                   $files[$file] = $info;
00059                }
00060             }
00061             closedir($dh);
00062          }
00063          ksort($files);
00064          $templateMgr =& TemplateManager::getManager();
00065          $templateMgr->assign_by_ref('files', $files);
00066          $templateMgr->assign('currentDir', $currentDir);
00067          $templateMgr->assign('parentDir', $parentDir);
00068          $templateMgr->assign('helpTopicId','press.managementPages.fileBrowser');
00069          $templateMgr->display('manager/files/index.tpl');
00070       }
00071    }
00072 
00078    function fileUpload($args, &$request) {
00079       $this->_parseDirArg($args, $currentDir, $parentDir);
00080       $currentPath = $this->_getRealFilesDir($request, $currentDir);
00081 
00082       import('lib.pkp.classes.file.PrivateFileManager');
00083       $privateFileManager = new PrivateFileManager();
00084       if ($privateFileManager->uploadedFileExists('file')) {
00085          $destPath = $currentPath . '/' . $this->cleanFileName($privateFileManager->getUploadedFileName('file'));
00086          @$privateFileManager->uploadFile('file', $destPath);
00087       }
00088 
00089       $request->redirect(null, null, 'files', explode('/', $currentDir));
00090 
00091    }
00092 
00098    function fileMakeDir($args, &$request) {
00099       $this->_parseDirArg($args, $currentDir, $parentDir);
00100 
00101       if ($dirName = $request->getUserVar('dirName')) {
00102          $currentPath = $this->_getRealFilesDir($request, $currentDir);
00103          $newDir = $currentPath . '/' . $this->cleanFileName($dirName);
00104 
00105          import('lib.pkp.classes.file.PrivateFileManager');
00106          $privateFileManager = new PrivateFileManager();
00107          @$privateFileManager->mkdir($newDir);
00108       }
00109 
00110       $request->redirect(null, null, 'files', explode('/', $currentDir));
00111    }
00112 
00118    function fileDelete($args, &$request) {
00119       $this->_parseDirArg($args, $currentDir, $parentDir);
00120       $currentPath = $this->_getRealFilesDir($request, $currentDir);
00121 
00122       import('lib.pkp.classes.file.PrivateFileManager');
00123       $privateFileManager = new PrivateFileManager();
00124 
00125       if (@is_file($currentPath)) {
00126          $privateFileManager->deleteFile($currentPath);
00127       } else {
00128          // TODO Use recursive delete (rmtree) instead?
00129          @$privateFileManager->rmdir($currentPath);
00130       }
00131 
00132       $request->redirect(null, null, 'files', explode('/', $parentDir));
00133    }
00134 
00135 
00136    //
00137    // Helper functions
00138    // FIXME Move some of these functions into common class (FileManager?)
00139    //
00140 
00141    function _parseDirArg($args, &$currentDir, &$parentDir) {
00142       $pathArray = array_filter($args, array('FilesHandler', 'fileNameFilter'));
00143       $currentDir = join($pathArray, '/');
00144       array_pop($pathArray);
00145       $parentDir = join($pathArray, '/');
00146    }
00147 
00154    function _getRealFilesDir($request, $currentDir) {
00155       $press =& $request->getPress();
00156       import('classes.file.PressFileManager');
00157       $pressFileManager = new PrivateFileManager($press->getId());
00158       
00159       return $privateFileManager->getBasePath() . $currentDir;
00160    }
00161 
00162    function fileNameFilter($var) {
00163       return (!empty($var) && $var != '..' && $var != '.');
00164    }
00165 
00166    function cleanFileName($var) {
00167       $var = String::regexp_replace('/[^\w\-\.]/', '', $var);
00168       if (!$this->fileNameFilter($var)) {
00169          $var = time() . '';
00170       }
00171       return $var;
00172    }
00173 
00174    function fileMimeType($filePath) {
00175       return String::mime_content_type($filePath);
00176    }
00177 
00178 }
00179 ?>

Generated on Mon Sep 17 2012 13:58:56 for Open Monograph Press by  doxygen 1.7.1