This class handles all operations on files for the exercise object. More...
Inheritance diagram for ilFileDataExercise:
Collaboration diagram for ilFileDataExercise:Public Member Functions | |
| ilFileDataExercise ($a_obj_id=0) | |
| Constructor call base constructors checks if directory is writable and sets the optional obj_id. | |
| getObjId () | |
| getExercisePath () | |
| get exercise path public | |
| getFiles () | |
| ilClone ($a_new_obj_id) | |
| delete () | |
| storeUploadedFile ($a_http_post_file, $secure_filename=false, $is_unziped=false) | |
| store uploaded file in filesystem | |
| storeContentAsFile ($filename, $content, $secure_filename=false) | |
| store content as file in filesystem | |
| deliverFile ($a_http_post_file, $user_id, $is_unziped=false) | |
| store delivered file in filesystem | |
| downloadAllDeliveredFiles ($members) | |
| Download all submitted files of all members. | |
| unlinkFiles ($a_filenames) | |
| unlink files: expects an array of filenames e.g. | |
| unlinkFile ($a_filename) | |
| unlink one uploaded file expects a filename e.g 'foo' | |
| getAbsolutePath ($a_path) | |
| get absolute path of filename | |
| checkFilesExist ($a_files) | |
| check if files exist | |
| __checkPath () | |
| __checkReadWrite () | |
| check if directory is writable overwritten method from base class private | |
| __initDirectory () | |
| init directory overwritten method public | |
| __rotateFiles ($a_path) | |
| rotate files with same name recursive method | |
Data Fields | |
| $obj_id | |
| $exercise_path | |
This class handles all operations on files for the exercise object.
Definition at line 34 of file class.ilFileDataExercise.php.
| ilFileDataExercise::__checkPath | ( | ) |
Definition at line 465 of file class.ilFileDataExercise.php.
References __checkReadWrite(), and getExercisePath().
Referenced by ilFileDataExercise().
{
if(!@file_exists($this->getExercisePath()))
{
return false;
}
$this->__checkReadWrite();
return true;
}
Here is the call graph for this function:
Here is the caller graph for this function:| ilFileDataExercise::__checkReadWrite | ( | ) |
check if directory is writable overwritten method from base class private
Definition at line 481 of file class.ilFileDataExercise.php.
Referenced by __checkPath().
{
if(is_writable($this->exercise_path) && is_readable($this->exercise_path))
{
return true;
}
else
{
$this->ilias->raiseError("Exercise directory is not readable/writable by webserver",$this->ilias->error_obj->FATAL);
}
}
Here is the caller graph for this function:| ilFileDataExercise::__initDirectory | ( | ) |
init directory overwritten method public
Definition at line 498 of file class.ilFileDataExercise.php.
References ilFileData::getPath(), and ilUtil::makeDir().
Referenced by ilFileDataExercise().
{
if(is_writable($this->getPath()))
{
return ilUtil::makeDir($this->excercise_path = $this->getPath().'/'.EXERCISE_PATH);
}
return false;
}
Here is the call graph for this function:
Here is the caller graph for this function:| ilFileDataExercise::__rotateFiles | ( | $ | a_path | ) |
rotate files with same name recursive method
| string | filename private |
Definition at line 513 of file class.ilFileDataExercise.php.
Referenced by storeContentAsFile(), and storeUploadedFile().
{
if(file_exists($a_path))
{
$this->__rotateFiles($a_path.".old");
return rename($a_path,$a_path.'.old');
}
return true;
}
Here is the caller graph for this function:| ilFileDataExercise::checkFilesExist | ( | $ | a_files | ) |
check if files exist
| array | filenames to check public |
Definition at line 448 of file class.ilFileDataExercise.php.
References $file.
{
if($a_files)
{
foreach($a_files as $file)
{
if(!file_exists($this->exercise_path.'/'.$this->obj_id.'_'.$file))
{
return false;
}
}
return true;
}
return true;
}
| ilFileDataExercise::delete | ( | ) |
Definition at line 123 of file class.ilFileDataExercise.php.
References $file, ilUtil::delDir(), getExercisePath(), getFiles(), and unlinkFile().
{
foreach($this->getFiles() as $file)
{
$this->unlinkFile($file["name"]);
}
$delivered_file_path = $this->getExercisePath() . "/" . $this->obj_id . "/";
if (is_dir($delivered_file_path))
{
include_once "./Services/Utilities/classes/class.ilUtil.php";
ilUtil::delDir($delivered_file_path);
}
return true;
}
Here is the call graph for this function:| ilFileDataExercise::deliverFile | ( | $ | a_http_post_file, | |
| $ | user_id, | |||
| $ | is_unziped = false | |||
| ) |
store delivered file in filesystem
| array | HTTP_POST_FILES | |
| numeric | database id of the user who delivered the file public |
Definition at line 229 of file class.ilFileDataExercise.php.
References $filename, getExercisePath(), ilObjMediaObject::getMimeType(), ilUtil::makeDir(), and ilUtil::moveUploadedFile().
Referenced by downloadAllDeliveredFiles().
{
// TODO:
// CHECK UPLOAD LIMIT
//
$result = false;
if(isset($a_http_post_file) && $a_http_post_file['size'])
{
$filename = $a_http_post_file['name'];
// replace whitespaces with underscores
$filename = preg_replace("/\s/", "_", $filename);
// remove all special characters
$filename = preg_replace("/[^_a-zA-Z0-9\.]/", "", $filename);
if(!is_dir($savepath = $this->getExercisePath()."/".$this->obj_id))
{
ilUtil::makeDir($savepath);
}
$savepath .= '/' .$user_id;
if(!is_dir($savepath))
{
ilUtil::makeDir($savepath);
}
// CHECK IF FILE PATH EXISTS
if (!is_dir($savepath))
{
require_once "./Services/Utilities/classes/class.ilUtil.php";
#ilUtil::makeDirParents($savepath);
ilUtil::makeDir($savepath);
}
$now = getdate();
$prefix = sprintf("%04d%02d%02d%02d%02d%02d", $now["year"], $now["mon"], $now["mday"], $now["hours"],
$now["minutes"], $now["seconds"]);
if (!$is_unziped)
{
//move_uploaded_file($a_http_post_file["tmp_name"], $savepath . $prefix . "_" . $filename);
ilUtil::moveUploadedFile($a_http_post_file["tmp_name"], $a_http_post_file["name"],
$savepath . "/" . $prefix . "_" . $filename);
}
else
{
rename($a_http_post_file['tmp_name'],
$savepath . "/" . $prefix . "_" . $filename);
}
require_once "./Services/MediaObjects/classes/class.ilObjMediaObject.php";
if (is_file($savepath . "/" . $prefix . "_" . $filename))
{
$result = array(
"filename" => $prefix . "_" . $filename,
"fullname" => $savepath . "/" . $prefix . "_" . $filename,
"mimetype" => ilObjMediaObject::getMimeType($savepath . "/" . $prefix . "_" . $filename)
);
}
}
return $result;
}
Here is the call graph for this function:
Here is the caller graph for this function:| ilFileDataExercise::downloadAllDeliveredFiles | ( | $ | members | ) |
Download all submitted files of all members.
| $members | array of user names, key is user id |
Definition at line 296 of file class.ilFileDataExercise.php.
References $lng, $user, ilObjUser::_lookupLogin(), ilObjUser::_lookupName(), ilUtil::delDir(), deliverFile(), ilUtil::dirsize(), ilUtil::escapeShellArg(), ilUtil::getASCIIFilename(), getExercisePath(), getObjId(), ilUtil::ilTempnam(), and ilUtil::makeDir().
{
require_once "./Services/Utilities/classes/class.ilUtil.php";
global $lng, $ilObjDataCache;
ksort($members);
$savepath = $this->getExercisePath() . "/" . $this->obj_id . "/";
$cdir = getcwd();
// important check: if the directory does not exist
// ILIAS stays in the current directory (echoing only a warning)
// and the zip command below archives the whole ILIAS directory
// (including the data directory) and sends a mega file to the user :-o
if (!is_dir($savepath))
{
return;
}
// Safe mode fix
chdir($this->getExercisePath());
$zip = PATH_TO_ZIP;
// check first, if we have enough free disk space to copy all files to temporary directory
$tmpdir = ilUtil::ilTempnam();
ilUtil::makeDir($tmpdir);
chdir($tmpdir);
$dirsize = 0;
foreach ($members as $id => $object) {
$directory = $savepath.DIRECTORY_SEPARATOR.$id;
$dirsize += ilUtil::dirsize($directory);
}
if ($dirsize > disk_free_space($tmpdir)) {
return -1;
}
// copy all member directories to the temporary folder
// switch from id to member name and append the login if the member name is double
// ensure that no illegal filenames will be created
// remove timestamp from filename
$cache = array();
foreach ($members as $id => $user)
{
$sourcedir = $savepath.DIRECTORY_SEPARATOR.$id;
if (!is_dir($sourcedir))
continue;
$userName = ilObjUser::_lookupName($id);
$directory = ilUtil::getASCIIFilename($userName["lastname"]."_".$userName["firstname"]);
if (array_key_exists($directory, $cache))
{
// first try is to append the login;
$directory = ilUtil::getASCIIFilename($directory."_". ilObjUser::_lookupLogin($id));
if (array_key_exists($directory, $cache)) {
// second and secure: append the user id as well.
$directory .= "_".$id;
}
}
$cache[$directory] = $directory;
ilUtil::makeDir ($directory);
$sourcefiles = scandir($sourcedir);
foreach ($sourcefiles as $sourcefile) {
if ($sourcefile == "." || $sourcefile == "..")
continue;
$targetfile = trim(basename($sourcefile));
$pos = strpos($targetfile, "_");
if ($pos === false)
{
} else
{
$targetfile= substr($targetfile, $pos + 1);
}
$targetfile = $directory.DIRECTORY_SEPARATOR.$targetfile;
$sourcefile = $sourcedir.DIRECTORY_SEPARATOR.$sourcefile;
if (!copy ($sourcefile, $targetfile))
{
echo 'Could not copy '.$sourcefile.' to '.$targetfile;
} else
{
// preserve time stamp
touch($targetfile, filectime($sourcefile));
}
}
}
$tmpfile = ilUtil::ilTempnam();
$tmpzipfile = $tmpfile . ".zip";
// Safe mode fix
$zipcmd = $zip." -r ".ilUtil::escapeShellArg($tmpzipfile)." .";
exec($zipcmd);
ilUtil::delDir($tmpdir);
$exerciseTitle = $ilObjDataCache->lookupTitle($this->getObjId());
ilUtil::deliverFile($tmpzipfile, (strlen($exerciseTitle) == 0? strtolower($lng->txt("excs")) : $exerciseTitle). ".zip");
chdir($cdir);
unlink($tmpfile);
unlink($tmpzipfile);
}
Here is the call graph for this function:| ilFileDataExercise::getAbsolutePath | ( | $ | a_path | ) |
get absolute path of filename
| string | relative path public |
Definition at line 437 of file class.ilFileDataExercise.php.
Referenced by storeContentAsFile().
{
return $this->exercise_path.'/'.$this->obj_id.'_'.$a_path;
}
Here is the caller graph for this function:| ilFileDataExercise::getExercisePath | ( | ) |
get exercise path public
Definition at line 81 of file class.ilFileDataExercise.php.
Referenced by __checkPath(), delete(), deliverFile(), downloadAllDeliveredFiles(), ilClone(), and storeUploadedFile().
{
return $this->exercise_path;
}
Here is the caller graph for this function:| ilFileDataExercise::getFiles | ( | ) |
Definition at line 86 of file class.ilFileDataExercise.php.
References $file, $files, $obj_id, $rest, and ilFormat::formatDate().
Referenced by delete(), and ilClone().
{
$files = array();
$dp = opendir($this->exercise_path);
while($file = readdir($dp))
{
if(is_dir($file))
{
continue;
}
list($obj_id,$rest) = split('_',$file,2);
if($obj_id == $this->obj_id)
{
if(!is_dir($this->exercise_path.'/'.$file))
{
$files[] = array(
'name' => $rest,
'size' => filesize($this->exercise_path.'/'.$file),
'ctime' => ilFormat::formatDate(date('Y-m-d H:i:s',filectime($this->exercise_path.'/'.$file))),
'fullpath' => $this->exercise_path.'/'.$file);
}
}
}
closedir($dp);
return $files;
}
Here is the call graph for this function:
Here is the caller graph for this function:| ilFileDataExercise::getObjId | ( | ) |
Definition at line 71 of file class.ilFileDataExercise.php.
Referenced by downloadAllDeliveredFiles().
{
return $this->obj_id;
}
Here is the caller graph for this function:| ilFileDataExercise::ilClone | ( | $ | a_new_obj_id | ) |
Definition at line 114 of file class.ilFileDataExercise.php.
References $file, getExercisePath(), and getFiles().
{
foreach($this->getFiles() as $file)
{
@copy($this->getExercisePath()."/".$this->obj_id.'_'.$file["name"],
$this->getExercisePath()."/".$a_new_obj_id.'_'.$file["name"]);
}
return true;
}
Here is the call graph for this function:| ilFileDataExercise::ilFileDataExercise | ( | $ | a_obj_id = 0 |
) |
Constructor call base constructors checks if directory is writable and sets the optional obj_id.
| integereger | obj_id public |
Definition at line 57 of file class.ilFileDataExercise.php.
References __checkPath(), __initDirectory(), ilFileData::getPath(), and ilFileData::ilFileData().
{
define('EXERCISE_PATH','exercise');
parent::ilFileData();
$this->exercise_path = parent::getPath()."/".EXERCISE_PATH;
// IF DIRECTORY ISN'T CREATED CREATE IT
if(!$this->__checkPath())
{
$this->__initDirectory();
}
$this->obj_id = $a_obj_id;
}
Here is the call graph for this function:| ilFileDataExercise::storeContentAsFile | ( | $ | filename, | |
| $ | content, | |||
| $ | secure_filename = false | |||
| ) |
store content as file in filesystem
| $filename | Filename | |
| $content | base64 decoded content public |
Definition at line 191 of file class.ilFileDataExercise.php.
References $filename, __rotateFiles(), getAbsolutePath(), and ilUtil::virusHandling().
{
// TODO:
// CHECK UPLOAD LIMIT
//
if ($secure_filename)
{
// replace whitespaces with underscores
$filename = preg_replace("/\s/", "_", $filename);
// remove all special characters
$filename = preg_replace("/[^_a-zA-Z0-9\.]/", "", $filename);
}
if(count($content) > 0 )
{
// CHECK IF FILE WITH SAME NAME EXISTS
$filename = $this->getAbsolutePath($filename);
$this->__rotateFiles($filename);
file_put_contents($filename, $content);
// check for virus
$vir = ilUtil::virusHandling($filename);
if (!$vir[0] ||$vir[1] != "")
{
unlink($filename);
return false;
}
return true;
}
return false;
}
Here is the call graph for this function:| ilFileDataExercise::storeUploadedFile | ( | $ | a_http_post_file, | |
| $ | secure_filename = false, |
|||
| $ | is_unziped = false | |||
| ) |
store uploaded file in filesystem
| array | HTTP_POST_FILES | |
| boolean | $is_unziped true if uploaded file is unziped from archive public |
Definition at line 147 of file class.ilFileDataExercise.php.
References $filename, __rotateFiles(), getExercisePath(), and ilUtil::moveUploadedFile().
{
// TODO:
// CHECK UPLOAD LIMIT
//
$filename = $a_http_post_file['name'];
if ($secure_filename)
{
// replace whitespaces with underscores
$filename = preg_replace("/\s/", "_", $filename);
// remove all special characters
$filename = preg_replace("/[^_a-zA-Z0-9\.]/", "", $filename);
}
if(isset($a_http_post_file) && $a_http_post_file['size'])
{
// CHECK IF FILE WITH SAME NAME EXISTS
$this->__rotateFiles($this->getExercisePath().'/'.$this->obj_id.'_'.$filename);
//move_uploaded_file($a_http_post_file['tmp_name'],$this->getExercisePath().'/'.$this->obj_id.'_'.
// $filename);
if (!$is_unziped)
{
ilUtil::moveUploadedFile($a_http_post_file['tmp_name'], $a_http_post_file['name'],
$this->getExercisePath().'/'.$this->obj_id.'_'.$filename);
}
else
{
// ######## Warning, there is no check whether the unziped files are virus free or not
rename($a_http_post_file['tmp_name'],
$this->getExercisePath().'/'.$this->obj_id.'_'.$filename);
}
}
return true;
}
Here is the call graph for this function:| ilFileDataExercise::unlinkFile | ( | $ | a_filename | ) |
unlink one uploaded file expects a filename e.g 'foo'
| string | filename to delete public |
Definition at line 424 of file class.ilFileDataExercise.php.
Referenced by delete(), and unlinkFiles().
{
if(file_exists($this->exercise_path.'/'.$this->obj_id.'_'.$a_filename))
{
return unlink($this->exercise_path.'/'.$this->obj_id.'_'.$a_filename);
}
}
Here is the caller graph for this function:| ilFileDataExercise::unlinkFiles | ( | $ | a_filenames | ) |
unlink files: expects an array of filenames e.g.
array('foo','bar')
| array | filenames to delete public |
Definition at line 404 of file class.ilFileDataExercise.php.
References $file, and unlinkFile().
{
if(is_array($a_filenames))
{
foreach($a_filenames as $file)
{
if(!$this->unlinkFile($file))
{
return $file;
}
}
}
return '';
}
Here is the call graph for this function:| ilFileDataExercise::$exercise_path |
Definition at line 48 of file class.ilFileDataExercise.php.
| ilFileDataExercise::$obj_id |
Definition at line 41 of file class.ilFileDataExercise.php.
Referenced by getFiles().
1.7.1