ILIAS  release_4-4 Revision
All Data Structures Namespaces Files Functions Variables Modules Pages
ilFileUtils Class Reference

fileUtils class various functions for zip-archive handling More...

+ Collaboration diagram for ilFileUtils:

Public Member Functions

 processZipFile ($a_directory, $a_file, $structure, $ref_id=null, $containerType=null, $tree=null, $access_handler=null)
 unzips in given directory and processes uploaded zip for use as single files More...
 
 recursive_dirscan ($dir, &$arr)
 Recursively scans a given directory and writes path and filename into referenced array. More...
 
 createObjects ($dir, $structure, $ref_id, $containerType, $tree=null, $access_handler=null)
 Recursively scans a given directory and creates file and folder/category objects. More...
 
 createContainer ($name, $ref_id, $containerType, $tree=null, $access_handler=null)
 Creates and inserts container object (folder/category) into tree. More...
 
 createFile ($filename, $path, $ref_id, $tree=null, $access_handler=null)
 Creates and inserts file object into tree. More...
 
 utf8_encode ($string)
 utf8-encodes string if it is not a valid utf8-string. More...
 
 fastBase64Decode ($filein, $fileout)
 decodes base encoded file row by row to prevent memory exhaust More...
 
 fastBase64Encode ($filein, $fileout)
 decodes base encoded file row by row to prevent memory exhaust More...
 
 fastGZip ($in, $out, $level="9")
 fast compressing the file with the zlib-extension without memory consumption More...
 
 fastGunzip ($in, $out)
 fast uncompressing the file with the zlib-extension without memory consumption More...
 

Static Public Member Functions

static _lookupMimeType ($a_file)
 

Detailed Description

fileUtils class various functions for zip-archive handling

Author
Jan Hippchen janhi.nosp@m.ppch.nosp@m.en@gm.nosp@m.x.de

Definition at line 38 of file class.ilFileUtils.php.

Member Function Documentation

◆ _lookupMimeType()

static ilFileUtils::_lookupMimeType (   $a_file)
static
Parameters
stringfile absolute path to file

Definition at line 483 of file class.ilFileUtils.php.

Referenced by ilFileXMLParser\handlerEndTag().

484  {
485  if(!file_exists($a_file) or !is_readable($a_file))
486  {
487  return false;
488  }
489 
490  if(class_exists('finfo'))
491  {
492  $finfo = new finfo(FILEINFO_MIME);
493  return $finfo->buffer(file_get_contents($a_file));
494  }
495  if(function_exists('mime_content_type'))
496  {
497  return mime_content_type($a_file);
498  }
499  return 'application/octet-stream';
500  }
+ Here is the caller graph for this function:

◆ createContainer()

ilFileUtils::createContainer (   $name,
  $ref_id,
  $containerType,
  $tree = null,
  $access_handler = null 
)

Creates and inserts container object (folder/category) into tree.

Author
Jan Hippchen
Version
1.6.9.07
Parameters
string$nameName of the object
integer$ref_idref_id of parent
string$containerTypeFold or Cat
Returns
integer ref_id of containerobject

Definition at line 242 of file class.ilFileUtils.php.

References $lng, and $ref_id.

Referenced by createObjects().

243  {
244  switch($containerType)
245  {
246  case "Category":
247  include_once("./Modules/Category/classes/class.ilObjCategory.php");
248  $newObj = new ilObjCategory();
249  $newObj->setType("cat");
250  break;
251 
252  case "Folder":
253  include_once("./Modules/Folder/classes/class.ilObjFolder.php");
254  $newObj = new ilObjFolder();
255  $newObj->setType("fold");
256  break;
257 
258  case "WorkspaceFolder":
259  include_once("./Modules/WorkspaceFolder/classes/class.ilObjWorkspaceFolder.php");
260  $newObj = new ilObjWorkspaceFolder();
261  break;
262  }
263 
264  $newObj->setTitle($name);
265  $newObj->create();
266 
267  // repository
268  if(!$access_handler)
269  {
270  $newObj->createReference();
271  $newObj->putInTree($ref_id);
272  $newObj->setPermissions($ref_id);
273 
274  if ($newObj->getType() == "cat")
275  {
276  global $lng;
277  $newObj->addTranslation($name,"", $lng->getLangKey(), $lng->getLangKey());
278  }
279 
280  return $newObj->getRefId();
281  }
282  // workspace
283  else
284  {
285  $node_id = $tree->insertObject($ref_id, $newObj->getId());
286  $access_handler->setPermissions($ref_id, $node_id);
287 
288  return $node_id;
289  }
290  }
Class ilObjFolder.
Class ilObjCategory.
Class ilObjWorkspaceFolder.
$ref_id
Definition: sahs_server.php:39
global $lng
Definition: privfeed.php:40
+ Here is the caller graph for this function:

◆ createFile()

ilFileUtils::createFile (   $filename,
  $path,
  $ref_id,
  $tree = null,
  $access_handler = null 
)

Creates and inserts file object into tree.

Author
Jan Hippchen
Version
1.6.9.07
Parameters
string$filenameName of the object
string$pathPath to file
integer$ref_idref_id of parent

Definition at line 301 of file class.ilFileUtils.php.

References $filename, $path, $ref_id, ilObjMediaObject\getMimeType(), ilUtil\stripSlashes(), and utf8_encode().

Referenced by createObjects().

302  {
303  global $rbacsystem;
304 
305  if(!$access_handler)
306  {
307  $permission = $rbacsystem->checkAccess("create", $ref_id, "file");
308  }
309  else
310  {
311  $permission = $access_handler->checkAccess("create", "", $ref_id, "file");
312  }
313  if ($permission) {
314 
315  // create and insert file in grp_tree
316  include_once("./Modules/File/classes/class.ilObjFile.php");
317  $fileObj = new ilObjFile();
318  $fileObj->setType($this->type);
321 
322  // better use this, mime_content_type is deprecated
323  include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
324  $fileObj->setFileType(ilObjMediaObject::getMimeType($path. "/" . $filename));
325  $fileObj->setFileSize(filesize($path. "/" . $filename));
326  $fileObj->create();
327 
328  // repository
329  if(!$access_handler)
330  {
331  $fileObj->createReference();
332  $fileObj->putInTree($ref_id);
333  $fileObj->setPermissions($ref_id);
334  }
335  else
336  {
337  $node_id = $tree->insertObject($ref_id, $fileObj->getId());
338  $access_handler->setPermissions($ref_id, $node_id);
339  }
340 
341  // upload file to filesystem
342  $fileObj->createDirectory();
343  $fileObj->storeUnzipedFile($path. "/" . $filename,ilFileUtils::utf8_encode(ilUtil::stripSlashes($filename)));
344  }
345  else {
346  $this->ilErr->raiseError($this->lng->txt("permission_denied"),$this->ilErr->MESSAGE);
347  }
348  }
static getMimeType($a_file)
get mime type for file
utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
Class ilObjFile.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$filename
Definition: buildRTE.php:89
$ref_id
Definition: sahs_server.php:39
$path
Definition: index.php:22
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createObjects()

ilFileUtils::createObjects (   $dir,
  $structure,
  $ref_id,
  $containerType,
  $tree = null,
  $access_handler = null 
)

Recursively scans a given directory and creates file and folder/category objects.

Calls createContainer & createFile to store objects in tree

Author
Jan Hippchen
Version
1.6.9.07
Parameters
string$dirDirectory to start from
booleanstructure True if archive structure is to be overtaken (otherwise flat inclusion)
integer$ref_idref_id of parent object, if null, files won�t be included in system (just checked)
stringcontainerType object type of created containerobjects (folder or category)
Returns
integer errorcode

Definition at line 196 of file class.ilFileUtils.php.

References ilFileUtilsException\$BROKEN_FILE, $file, $lng, $ref_id, createContainer(), createFile(), and utf8_encode().

Referenced by processZipFile().

197  {
198  $dirlist = opendir($dir);
199 
200  while (false !== ($file = readdir ($dirlist)))
201  {
202  if (!is_file($dir . "/" . $file) && !is_dir($dir . "/" . $file))
203  {
204  throw new ilFileUtilsException($lng->txt("filenames_not_supported") , ilFileUtilsException::$BROKEN_FILE);
205  }
206  if ($file != '.' && $file != '..')
207  {
208  $newpath = $dir.'/'.$file;
209  $level = explode('/',$newpath);
210  if (is_dir($newpath))
211  {
212  if ($structure)
213  {
214  $new_ref_id = ilFileUtils::createContainer(ilFileUtils::utf8_encode($file), $ref_id, $containerType, $tree, $access_handler);
215  ilFileUtils::createObjects($newpath, $structure, $new_ref_id, $containerType, $tree, $access_handler);
216  }
217  else
218  {
219  ilFileUtils::createObjects($newpath, $structure, $ref_id, $containerType, $tree, $access_handler);
220  }
221  }
222  else
223  {
224  ilFileUtils::createFile (end($level), $dir, $ref_id, $tree, $access_handler);
225  }
226  }
227  }
228  closedir($dirlist);
229  }
print $file
createFile($filename, $path, $ref_id, $tree=null, $access_handler=null)
Creates and inserts file object into tree.
createContainer($name, $ref_id, $containerType, $tree=null, $access_handler=null)
Creates and inserts container object (folder/category) into tree.
utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
createObjects($dir, $structure, $ref_id, $containerType, $tree=null, $access_handler=null)
Recursively scans a given directory and creates file and folder/category objects. ...
$ref_id
Definition: sahs_server.php:39
global $lng
Definition: privfeed.php:40
Class to report exception.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fastBase64Decode()

ilFileUtils::fastBase64Decode (   $filein,
  $fileout 
)

decodes base encoded file row by row to prevent memory exhaust

Parameters
string$filenamename of file to read
string$fileoutname where to put decoded file

Definition at line 379 of file class.ilFileUtils.php.

Referenced by ilFileXMLParser\handlerEndTag().

380  {
381  $fh = fopen($filein, 'rb');
382  $fh2= fopen($fileout, 'wb');
383  stream_filter_append($fh2, 'convert.base64-decode');
384 
385  while (!feof($fh)){
386  $chunk = fgets($fh);
387  if ($chunk === false)
388  break;
389  fwrite ($fh2, $chunk);
390  }
391  fclose ($fh);
392  fclose ($fh2);
393  return true;
394  }
+ Here is the caller graph for this function:

◆ fastBase64Encode()

ilFileUtils::fastBase64Encode (   $filein,
  $fileout 
)

decodes base encoded file row by row to prevent memory exhaust

Parameters
string$filenamename of file to read
Returns
string base decoded content

Definition at line 401 of file class.ilFileUtils.php.

402  {
403  $fh = fopen($filein, 'rb');
404  $fh2= fopen($fileout, 'wb');
405  stream_filter_append($fh2, 'convert.base64-encode');
406 
407  while (feof ($fh)) {
408  $chunk = fgets($fh,76);
409  if ($chunk === false)
410  {
411  break;
412  }
413  fwrite ($fh2, $chunk);
414  }
415  fclose ($fh);
416  fclose ($fh2);
417  }

◆ fastGunzip()

ilFileUtils::fastGunzip (   $in,
  $out 
)

fast uncompressing the file with the zlib-extension without memory consumption

Parameters
string$infilename
string$outfilename
Returns
bool

Definition at line 459 of file class.ilFileUtils.php.

References $in, and $out.

Referenced by ilFileXMLParser\handlerEndTag().

460  {
461  if (!file_exists ($in) || !is_readable ($in))
462  return false;
463  if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
464  return false;
465 
466  $in_file = gzopen ($in, "rb");
467  $out_file = fopen ($out, "wb");
468 
469  while (!gzeof ($in_file)) {
470  $buffer = gzread ($in_file, 4096);
471  fwrite ($out_file, $buffer, 4096);
472  }
473 
474  gzclose ($in_file);
475  fclose ($out_file);
476 
477  return true;
478  }
+ Here is the caller graph for this function:

◆ fastGZip()

ilFileUtils::fastGZip (   $in,
  $out,
  $level = "9" 
)

fast compressing the file with the zlib-extension without memory consumption

Parameters
string$infilename
string$outfilename
string$levelcompression level from 1 to 9
Returns
bool

Definition at line 428 of file class.ilFileUtils.php.

References $in, and $out.

429  {
430  if (!file_exists ($in) || !is_readable ($in))
431  return false;
432  if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
433  return false;
434 
435  $in_file = fopen ($in, "rb");
436  if (!$out_file = gzopen ($out, "wb".$param)) {
437  return false;
438  }
439 
440  while (!feof ($in_file)) {
441  $buffer = fgets ($in_file, 4096);
442  gzwrite ($out_file, $buffer, 4096);
443  }
444 
445  fclose ($in_file);
446  gzclose ($out_file);
447 
448  return true;
449  }

◆ processZipFile()

ilFileUtils::processZipFile (   $a_directory,
  $a_file,
  $structure,
  $ref_id = null,
  $containerType = null,
  $tree = null,
  $access_handler = null 
)

unzips in given directory and processes uploaded zip for use as single files

Author
Jan Hippchen
Version
1.6.9.07
Parameters
string$a_directoryDirectory to unzip
string$a_fileFilename of archive
booleanstructure True if archive structure is to be overtaken
integer$ref_idref_id of parent object, if null, files wont be included in system (just checked)
stringcontainerType object type of created containerobjects (folder or category)
Exceptions
ilFileUtilsException

Definition at line 53 of file class.ilFileUtils.php.

References ilFileUtilsException\$BROKEN_FILE, ilFileUtilsException\$DOUBLETTES_FOUND, $file, ilFileUtilsException\$INFECTED_FILE, $lng, $ref_id, createObjects(), ilUtil\delDir(), recursive_dirscan(), ilUtil\unzip(), utf8_encode(), and ilUtil\virusHandling().

Referenced by ilCloudPluginUploadGUI\handleFileUpload(), ilObjFileGUI\handleFileUpload(), ilObjExercise\processUploadedFile(), and ilObjFileGUI\saveUnzip().

53  {
54 
55  global $lng;
56  include_once("Services/Utilities/classes/class.ilUtil.php");
57 
58  $pathinfo = pathinfo($a_file);
59  $file = $pathinfo["basename"];
60 
61  // Copy zip-file to new directory, unzip and remove it
62  // TODO: check archive for broken file
63  //copy ($a_file, $a_directory . "/" . $file);
64  move_uploaded_file($a_file, $a_directory . "/" . $file);
65  ilUtil::unzip($a_directory . "/" . $file);
66  unlink ($a_directory . "/" . $file);
67 //echo "-".$a_directory . "/" . $file."-";
68  // Stores filename and paths into $filearray to check for viruses
69  // Checks if filenames can be read, else -> throw exception and leave
70  ilFileUtils::recursive_dirscan($a_directory, $filearray);
71 
72  // if there are no files unziped (->broken file!)
73  if (empty($filearray)) {
74  throw new ilFileUtilsException($lng->txt("archive_broken"), ilFileUtilsException::$BROKEN_FILE);
75  break;
76  }
77 
78  // virus handling
79  foreach ($filearray["file"] as $key => $value)
80  {
81  // remove "invisible" files
82  if(substr($value, 0, 1) == "." || stristr($filearray["path"][$key], "/__MACOSX/"))
83  {
84  unlink($filearray["path"][$key].$value);
85  unset($filearray["path"][$key]);
86  unset($filearray["file"][$key]);
87  continue;
88  }
89 
90  $vir = ilUtil::virusHandling($filearray["path"][$key], $value);
91  if (!$vir[0])
92  {
93  // Unlink file and throw exception
94  unlink($filearray[path][$key]);
95  throw new ilFileUtilsException($lng->txt("file_is_infected")."<br />".$vir[1], ilFileUtilsException::$INFECTED_FILE);
96  break;
97  }
98  else
99  {
100  if ($vir[1] != "")
101  {
103  break;
104  }
105  }
106  }
107 
108  // If archive is to be used "flat"
109  if (!$structure)
110  {
111  foreach (array_count_values($filearray["file"]) as $key => $value)
112  {
113  // Archive contains same filenames in different directories
114  if ($value != "1")
115  {
116  $doublettes .= " '" . ilFileUtils::utf8_encode($key) . "'";
117 
118  }
119  }
120  if (isset($doublettes))
121  {
122  throw new ilFileUtilsException($lng->txt("exc_upload_error") . "<br />" . $lng->txt("zip_structure_error") . $doublettes ,
124  break;
125  }
126  }
127  else
128  {
129  $mac_dir = $a_directory."/__MACOSX";
130  if(file_exists($mac_dir))
131  {
132  ilUtil::delDir($mac_dir);
133  }
134  }
135 
136  // Everything fine since we got here; so we can store files and folders into the system (if ref_id is given)
137  if ($ref_id != null)
138  {
139  ilFileUtils::createObjects ($a_directory, $structure, $ref_id, $containerType, $tree, $access_handler);
140  }
141 
142  }
print $file
static virusHandling($a_file, $a_orig_name="", $a_clean=true)
scan file for viruses and clean files if possible
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
createObjects($dir, $structure, $ref_id, $containerType, $tree=null, $access_handler=null)
Recursively scans a given directory and creates file and folder/category objects. ...
$ref_id
Definition: sahs_server.php:39
recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
global $lng
Definition: privfeed.php:40
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
Class to report exception.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ recursive_dirscan()

ilFileUtils::recursive_dirscan (   $dir,
$arr 
)

Recursively scans a given directory and writes path and filename into referenced array.

Author
Jan Hippchen
Version
1.6.9.07
Parameters
string$dirDirectory to start from
array&$arrReferenced array which is filled with Filename and path

Definition at line 152 of file class.ilFileUtils.php.

References ilFileUtilsException\$BROKEN_FILE, $file, and $lng.

Referenced by ilSCORM13Package\dbImportSco(), ilSCORM2004Asset\exportPDF(), ilObjSCORM2004LearningModule\exportPDF(), ilObjTest\getCustomStyles(), ilObjExercise\processUploadedFile(), processZipFile(), and ilUtil\unzip().

153  {
154  global $lng;
155 
156  $dirlist = opendir($dir);
157  while (false !== ($file = readdir ($dirlist)))
158  {
159  if (!is_file($dir . "/" . $file) && !is_dir($dir . "/" . $file))
160  {
161  throw new ilFileUtilsException($lng->txt("filenames_not_supported"), ilFileUtilsException::$BROKEN_FILE);
162  }
163 
164  if ($file != '.' && $file != '..')
165  {
166  $newpath = $dir.'/'.$file;
167  $level = explode('/',$newpath);
168  if (is_dir($newpath))
169  {
170  ilFileUtils::recursive_dirscan($newpath, $arr);
171  }
172  else
173  {
174  $arr["path"][] = $dir . "/";
175  $arr["file"][] = end($level);
176  }
177  }
178  }
179  closedir($dirlist);
180  }
print $file
recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
global $lng
Definition: privfeed.php:40
Class to report exception.
+ Here is the caller graph for this function:

◆ utf8_encode()

ilFileUtils::utf8_encode (   $string)

utf8-encodes string if it is not a valid utf8-string.

Author
Jan Hippchen
Version
1.12.3.08
Parameters
string$stringString to encode
Returns
string utf-8-encoded string

Definition at line 358 of file class.ilFileUtils.php.

Referenced by createFile(), createObjects(), ilSCORM13Package\dbImportSco(), ilObjExercise\processUploadedFile(), and processZipFile().

358  {
359 
360  // From http://w3.org/International/questions/qa-forms-utf-8.html
361  return (preg_match('%^(?:
362  [\x09\x0A\x0D\x20-\x7E] # ASCII
363  | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
364  | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
365  | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
366  | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
367  | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
368  | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
369  | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
370  )*$%xs', $string))? $string : utf8_encode($string);
371  }
utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
+ Here is the caller graph for this function:

The documentation for this class was generated from the following file: