ILIAS  Release_4_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilFileUtils.php
Go to the documentation of this file.
1 <?php
2 /*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +-----------------------------------------------------------------------------+
22 */
23 
35 include_once 'Services/Utilities/classes/class.ilFileUtilsException.php';
36 
37 
39 {
53  function processZipFile ($a_directory, $a_file, $structure, $ref_id = null, $containerType = null) {
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  $vir = ilUtil::virusHandling($filearray[path][$key], $value);
82  if (!$vir[0])
83  {
84  // Unlink file and throw exception
85  unlink($filearray[path][$key]);
86  throw new ilFileUtilsException($lng->txt("file_is_infected")."<br />".$vir[1], ilFileUtilsException::$INFECTED_FILE);
87  break;
88  }
89  else
90  {
91  if ($vir[1] != "")
92  {
94  break;
95  }
96  }
97 
98  }
99 
100  // If archive is to be used "flat"
101  if (!$structure)
102  {
103  foreach (array_count_values($filearray["file"]) as $key => $value)
104  {
105  // Archive contains same filenames in different directories
106  if ($value != "1")
107  {
108  $doublettes .= " '" . ilFileUtils::utf8_encode($key) . "'";
109 
110  }
111  }
112  if (isset($doublettes))
113  {
114  throw new ilFileUtilsException($lng->txt("exc_upload_error") . "<br />" . $lng->txt("zip_structure_error") . $doublettes ,
116  break;
117  }
118  }
119 
120  // Everything fine since we got here; so we can store files and folders into the system (if ref_id is given)
121  if ($ref_id != null)
122  {
123  ilFileUtils::createObjects ($a_directory, $structure, $ref_id, $containerType);
124  }
125 
126  }
127 
136  function recursive_dirscan($dir, &$arr)
137  {
138  global $lng;
139 
140  $dirlist = opendir($dir);
141  while (false !== ($file = readdir ($dirlist)))
142  {
143  if (!is_file($dir . "/" . $file) && !is_dir($dir . "/" . $file))
144  {
145  throw new ilFileUtilsException($lng->txt("filenames_not_supported"), ilFileUtilsException::$BROKEN_FILE);
146  }
147 
148  if ($file != '.' && $file != '..')
149  {
150  $newpath = $dir.'/'.$file;
151  $level = explode('/',$newpath);
152  if (is_dir($newpath))
153  {
154  ilFileUtils::recursive_dirscan($newpath, $arr);
155  }
156  else
157  {
158  $arr["path"][] = $dir . "/";
159  $arr["file"][] = end($level);
160  }
161  }
162  }
163  closedir($dirlist);
164  }
165 
166 
180  function createObjects($dir, $structure, $ref_id, $containerType)
181  {
182  $dirlist = opendir($dir);
183 
184  while (false !== ($file = readdir ($dirlist)))
185  {
186  if (!is_file($dir . "/" . $file) && !is_dir($dir . "/" . $file))
187  {
188  throw new ilFileUtilsException($lng->txt("filenames_not_supported") , ilFileUtilsException::$BROKEN_FILE);
189  }
190  if ($file != '.' && $file != '..')
191  {
192  $newpath = $dir.'/'.$file;
193  $level = explode('/',$newpath);
194  if (is_dir($newpath))
195  {
196  if ($structure)
197  {
198  $new_ref_id = ilFileUtils::createContainer(ilFileUtils::utf8_encode($file), $ref_id, $containerType);
199  ilFileUtils::createObjects($newpath, $structure, $new_ref_id, $containerType);
200  }
201  else
202  {
203  ilFileUtils::createObjects($newpath, $structure, $ref_id, $containerType);
204  }
205  }
206  else
207  {
208  ilFileUtils::createFile (end($level),$dir,$ref_id);
209  }
210  }
211  }
212  closedir($dirlist);
213  }
214 
215 
226  function createContainer($name, $ref_id, $containerType)
227  {
228  if ($containerType == "Category")
229  {
230  include_once("./Modules/Category/classes/class.ilObjCategory.php");
231  $newObj = new ilObjCategory();
232  $newObj->setType("cat");
233  }
234  if ($containerType == "Folder")
235  {
236  include_once("./Modules/Folder/classes/class.ilObjFolder.php");
237  $newObj = new ilObjFolder();
238  $newObj->setType("fold");
239  }
240 
241  $newObj->setTitle($name);
242  $newObj->create();
243  $newObj->createReference();
244  $newObj->putInTree($ref_id);
245  $newObj->setPermissions($ref_id);
246  $newObj->initDefaultRoles();
247 
248  if ($newObj->getType() == "cat")
249  {
250  global $lng;
251  $newObj->addTranslation($name,"", $lng->getLangKey(), $lng->getLangKey());
252  }
253 
254  return $newObj->getRefId();
255  }
256 
266  function createFile ($filename, $path, $ref_id)
267  {
268  global $rbacsystem;
269  if ($rbacsystem->checkAccess("create", $ref_id, "file")) {
270 
271  // create and insert file in grp_tree
272  include_once("./Modules/File/classes/class.ilObjFile.php");
273  $fileObj = new ilObjFile();
274  $fileObj->setType($this->type);
277 
278  // better use this, mime_content_type is deprecated
279  include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
280  $fileObj->setFileType(ilObjMediaObject::getMimeType($path. "/" . $filename));
281 
282  $fileObj->setFileSize(filesize($path. "/" . $filename));
283  $fileObj->create();
284  $fileObj->createReference();
285 
286  $fileObj->putInTree($ref_id);
287  $fileObj->setPermissions($ref_id);
288 
289  // upload file to filesystem
290 
291  $fileObj->createDirectory();
292 
293  $fileObj->storeUnzipedFile($path. "/" . $filename,ilFileUtils::utf8_encode(ilUtil::stripSlashes($filename)));
294  }
295  else {
296  $this->ilErr->raiseError($this->lng->txt("permission_denied"),$this->ilErr->MESSAGE);
297  }
298  }
299 
308  function utf8_encode($string) {
309 
310  // From http://w3.org/International/questions/qa-forms-utf-8.html
311  return (preg_match('%^(?:
312  [\x09\x0A\x0D\x20-\x7E] # ASCII
313  | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
314  | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
315  | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
316  | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
317  | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
318  | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
319  | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
320  )*$%xs', $string))? $string : utf8_encode($string);
321  }
322 
323 
329  function fastBase64Decode ($filein, $fileout)
330  {
331  $fh = fopen($filein, 'rb');
332  $fh2= fopen($fileout, 'wb');
333  stream_filter_append($fh2, 'convert.base64-decode');
334 
335  while (!feof($fh)){
336  $chunk = fgets($fh);
337  if ($chunk === false)
338  break;
339  fwrite ($fh2, $chunk);
340  }
341  fclose ($fh);
342  fclose ($fh2);
343  return true;
344  }
345 
351  function fastBase64Encode ($filein, $fileout)
352  {
353  $fh = fopen($filein, 'rb');
354  $fh2= fopen($fileout, 'wb');
355  stream_filter_append($fh2, 'convert.base64-encode');
356 
357  while (feof ($fh)) {
358  $chunk = fgets($fh,76);
359  if ($chunk === false)
360  {
361  break;
362  }
363  fwrite ($fh2, $chunk);
364  }
365  fclose ($fh);
366  fclose ($fh2);
367  }
368 
378  function fastGZip ($in, $out, $level="9")
379  {
380  if (!file_exists ($in) || !is_readable ($in))
381  return false;
382  if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
383  return false;
384 
385  $in_file = fopen ($in, "rb");
386  if (!$out_file = gzopen ($out, "wb".$param)) {
387  return false;
388  }
389 
390  while (!feof ($in_file)) {
391  $buffer = fgets ($in_file, 4096);
392  gzwrite ($out_file, $buffer, 4096);
393  }
394 
395  fclose ($in_file);
396  gzclose ($out_file);
397 
398  return true;
399  }
400 
409  function fastGunzip ($in, $out)
410  {
411  if (!file_exists ($in) || !is_readable ($in))
412  return false;
413  if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
414  return false;
415 
416  $in_file = gzopen ($in, "rb");
417  $out_file = fopen ($out, "wb");
418 
419  while (!gzeof ($in_file)) {
420  $buffer = gzread ($in_file, 4096);
421  fwrite ($out_file, $buffer, 4096);
422  }
423 
424  gzclose ($in_file);
425  fclose ($out_file);
426 
427  return true;
428  }
429 
433  public static function _lookupMimeType($a_file)
434  {
435  if(!file_exists($a_file) or !is_readable($a_file))
436  {
437  return false;
438  }
439 
440  if(class_exists('finfo'))
441  {
442  $finfo = new finfo(FILEINFO_MIME);
443  return $finfo->buffer(file_get_contents($a_file));
444  }
445  if(function_exists('mime_content_type'))
446  {
447  return mime_content_type($a_file);
448  }
449  return 'application/octet-stream';
450  }
451 
452 } // END class.ilFileUtils
453 
454 
455 ?>