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
00129 @$privateFileManager->rmdir($currentPath);
00130 }
00131
00132 $request->redirect(null, null, 'files', explode('/', $parentDir));
00133 }
00134
00135
00136
00137
00138
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 ?>