ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilFileInputGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once 'Services/UIComponent/Toolbar/interfaces/interface.ilToolbarItem.php';
5 include_once("./Services/Form/classes/class.ilSubEnabledFormPropertyGUI.php");
6 
15 {
16  private $filename;
17  private $filename_post;
18  protected $size = 40;
19  protected $pending;
20  protected $allow_deletion;
21 
22  static protected $check_wsp_quota;
23 
27  protected $forbidden_suffixes = array();
28 
35  function __construct($a_title = "", $a_postvar = "")
36  {
37  global $lng;
38 
39  parent::__construct($a_title, $a_postvar);
40  $this->setType("file");
41  $this->setHiddenTitle("(".$lng->txt("form_file_input").")");
42  }
43 
49  function setValueByArray($a_values)
50  {
51  if (!is_array($a_values[$this->getPostVar()]))
52  {
53  $this->setValue($a_values[$this->getPostVar()]);
54  }
55  $this->setFilename($a_values[$this->getFileNamePostVar()]);
56  }
57 
63  function setValue($a_value)
64  {
65  $this->value = $a_value;
66  }
67 
73  function getValue()
74  {
75  return $this->value;
76  }
77 
83  function setSize($a_size)
84  {
85  $this->size = $a_size;
86  }
87 
93  function getSize()
94  {
95  return $this->size;
96  }
97 
103  public function setFilename($a_val)
104  {
105  $this->filename = $a_val;
106  }
107 
113  function getFilename()
114  {
115  return $this->filename;
116  }
117 
118 
119 
125  function setSuffixes($a_suffixes)
126  {
127  $this->suffixes = $a_suffixes;
128  }
129 
135  function getSuffixes()
136  {
137  return $this->suffixes;
138  }
139 
145  function setForbiddenSuffixes($a_suffixes)
146  {
147  $this->forbidden_suffixes = $a_suffixes;
148  }
149 
156  {
158  }
159 
165  public function setPending($a_val)
166  {
167  $this->pending = $a_val;
168  }
169 
175  function getPending()
176  {
177  return $this->pending;
178  }
179 
187  public function enableFileNameSelection($a_post_var)
188  {
189  $this->filename_selection = true;
190  $this->filename_post = $a_post_var;
191  }
192 
199  public function isFileNameSelectionEnabled()
200  {
201  return $this->filename_selection ? true : false;
202  }
203 
211  public function getFileNamePostVar()
212  {
213  return $this->filename_post;
214  }
215 
221  function setALlowDeletion($a_val)
222  {
223  $this->allow_deletion = $a_val;
224  }
225 
231  function getALlowDeletion()
232  {
233  return $this->allow_deletion;
234  }
235 
241  function checkInput()
242  {
243  global $lng;
244 
245  // #18756
246  if($this->getDisabled())
247  {
248  return true;
249  }
250 
251  // if no information is received, something went wrong
252  // this is e.g. the case, if the post_max_size has been exceeded
253  if (!is_array($_FILES[$this->getPostVar()]))
254  {
255  $this->setAlert($lng->txt("form_msg_file_size_exceeds"));
256  return false;
257  }
258 
259  $_FILES[$this->getPostVar()]["name"] = ilUtil::stripSlashes($_FILES[$this->getPostVar()]["name"]);
260 
261  include_once("./Services/Utilities/classes/class.ilStr.php");
262  $_FILES[$this->getPostVar()]["name"] = ilStr::normalizeUtf8String($_FILES[$this->getPostVar()]["name"]);
263 
264  // remove trailing '/'
265  $_FILES[$this->getPostVar()]["name"] = rtrim($_FILES[$this->getPostVar()]["name"], '/');
266 
267  $filename = $_FILES[$this->getPostVar()]["name"];
268  $filename_arr = pathinfo($_FILES[$this->getPostVar()]["name"]);
269  $suffix = $filename_arr["extension"];
270  $mimetype = $_FILES[$this->getPostVar()]["type"];
271  $size_bytes = $_FILES[$this->getPostVar()]["size"];
272  $temp_name = $_FILES[$this->getPostVar()]["tmp_name"];
273  $error = $_FILES[$this->getPostVar()]["error"];
274  $_POST[$this->getPostVar()] = $_FILES[$this->getPostVar()];
275 
276  // error handling
277  if ($error > 0)
278  {
279  switch ($error)
280  {
281  case UPLOAD_ERR_INI_SIZE:
282  $this->setAlert($lng->txt("form_msg_file_size_exceeds"));
283  return false;
284  break;
285 
286  case UPLOAD_ERR_FORM_SIZE:
287  $this->setAlert($lng->txt("form_msg_file_size_exceeds"));
288  return false;
289  break;
290 
291  case UPLOAD_ERR_PARTIAL:
292  $this->setAlert($lng->txt("form_msg_file_partially_uploaded"));
293  return false;
294  break;
295 
296  case UPLOAD_ERR_NO_FILE:
297  if ($this->getRequired())
298  {
299  if (!strlen($this->getValue()))
300  {
301  $this->setAlert($lng->txt("form_msg_file_no_upload"));
302  return false;
303  }
304  }
305  break;
306 
307  case UPLOAD_ERR_NO_TMP_DIR:
308  $this->setAlert($lng->txt("form_msg_file_missing_tmp_dir"));
309  return false;
310  break;
311 
312  case UPLOAD_ERR_CANT_WRITE:
313  $this->setAlert($lng->txt("form_msg_file_cannot_write_to_disk"));
314  return false;
315  break;
316 
317  case UPLOAD_ERR_EXTENSION:
318  $this->setAlert($lng->txt("form_msg_file_upload_stopped_ext"));
319  return false;
320  break;
321  }
322  }
323 
324  // check suffixes
325  if ($_FILES[$this->getPostVar()]["tmp_name"] != "")
326  {
327  if (is_array($this->forbidden_suffixes) && in_array(strtolower($suffix), $this->forbidden_suffixes))
328  {
329  $this->setAlert($lng->txt("form_msg_file_type_is_not_allowed")." (".$suffix.")");
330  return false;
331  }
332  if (is_array($this->getSuffixes()) && count($this->getSuffixes()) > 0)
333  {
334  if (!in_array(strtolower($suffix), $this->getSuffixes()))
335  {
336  $this->setAlert($lng->txt("form_msg_file_wrong_file_type"));
337  return false;
338  }
339  }
340  }
341 
342  // virus handling
343  if ($_FILES[$this->getPostVar()]["tmp_name"] != "")
344  {
345  $vir = ilUtil::virusHandling($temp_name, $filename);
346  if ($vir[0] == false)
347  {
348  $this->setAlert($lng->txt("form_msg_file_virus_found")."<br />".$vir[1]);
349  return false;
350  }
351  }
352 
353  return true;
354  }
355 
359  function render($a_mode = "")
360  {
361  global $lng;
362 
363  $quota_exceeded = $quota_legend = false;
364  if(self::$check_wsp_quota)
365  {
366  include_once "Services/DiskQuota/classes/class.ilDiskQuotaHandler.php";
368  {
369  $lng->loadLanguageModule("file");
370  $quota_exceeded = $lng->txt("personal_workspace_quota_exceeded_warning");
371  }
372  else
373  {
374  $quota_legend = ilDiskQuotaHandler::getStatusLegend();
375  }
376  }
377 
378  $f_tpl = new ilTemplate("tpl.prop_file.html", true, true, "Services/Form");
379 
380 
381  // show filename selection if enabled
382  if($this->isFileNameSelectionEnabled())
383  {
384  $f_tpl->setCurrentBlock('filename');
385  $f_tpl->setVariable('POST_FILENAME',$this->getFileNamePostVar());
386  $f_tpl->setVariable('VAL_FILENAME',$this->getFilename());
387  $f_tpl->setVariable('FILENAME_ID',$this->getFieldId());
388  $f_tpl->setVAriable('TXT_FILENAME_HINT',$lng->txt('if_no_title_then_filename'));
389  $f_tpl->parseCurrentBlock();
390  }
391  else
392  {
393  if (trim($this->getValue() != ""))
394  {
395  if (!$this->getDisabled() && $this->getALlowDeletion())
396  {
397  $f_tpl->setCurrentBlock("delete_bl");
398  $f_tpl->setVariable("POST_VAR_D", $this->getPostVar());
399  $f_tpl->setVariable("TXT_DELETE_EXISTING",
400  $lng->txt("delete_existing_file"));
401  $f_tpl->parseCurrentBlock();
402  }
403 
404  $f_tpl->setCurrentBlock('prop_file_propval');
405  $f_tpl->setVariable('FILE_VAL', $this->getValue());
406  $f_tpl->parseCurrentBlock();
407  }
408  }
409 
410  if ($a_mode != "toolbar")
411  {
412  if(!$quota_exceeded)
413  {
414  $this->outputSuffixes($f_tpl);
415 
416  $f_tpl->setCurrentBlock("max_size");
417  $f_tpl->setVariable("TXT_MAX_SIZE", $lng->txt("file_notice")." ".
418  $this->getMaxFileSizeString());
419  $f_tpl->parseCurrentBlock();
420 
421  if($quota_legend)
422  {
423  $f_tpl->setVariable("TXT_MAX_SIZE", $quota_legend);
424  $f_tpl->parseCurrentBlock();
425  }
426  }
427  else
428  {
429  $f_tpl->setCurrentBlock("max_size");
430  $f_tpl->setVariable("TXT_MAX_SIZE", $quota_exceeded);
431  $f_tpl->parseCurrentBlock();
432  }
433  }
434  else if($quota_exceeded)
435  {
436  return $quota_exceeded;
437  }
438 
439  $pending = $this->getPending();
440  if($pending)
441  {
442  $f_tpl->setCurrentBlock("pending");
443  $f_tpl->setVariable("TXT_PENDING", $lng->txt("file_upload_pending").
444  ": ".$pending);
445  $f_tpl->parseCurrentBlock();
446  }
447 
448  if ($this->getDisabled() || $quota_exceeded)
449  {
450  $f_tpl->setVariable("DISABLED",
451  " disabled=\"disabled\"");
452  }
453 
454  $f_tpl->setVariable("POST_VAR", $this->getPostVar());
455  $f_tpl->setVariable("ID", $this->getFieldId());
456  $f_tpl->setVariable("SIZE", $this->getSize());
457 
458 
459  /* experimental: bootstrap'ed file upload */
460  $f_tpl->setVariable("TXT_BROWSE", $lng->txt("select_file"));
461 
462 
463  return $f_tpl->get();
464  }
465 
471  function insert($a_tpl)
472  {
473  $html = $this->render();
474 
475  $a_tpl->setCurrentBlock("prop_generic");
476  $a_tpl->setVariable("PROP_GENERIC", $html);
477  $a_tpl->parseCurrentBlock();
478  }
479 
480 
481  protected function outputSuffixes($a_tpl, $a_block = "allowed_suffixes")
482  {
483  global $lng;
484 
485  if (is_array($this->getSuffixes()) && count($this->getSuffixes()) > 0)
486  {
487  $suff_str = $delim = "";
488  foreach($this->getSuffixes() as $suffix)
489  {
490  $suff_str.= $delim.".".$suffix;
491  $delim = ", ";
492  }
493  $a_tpl->setCurrentBlock($a_block);
494  $a_tpl->setVariable("TXT_ALLOWED_SUFFIXES",
495  $lng->txt("file_allowed_suffixes")." ".$suff_str);
496  $a_tpl->parseCurrentBlock();
497  }
498  }
499 
500  protected function getMaxFileSizeString()
501  {
502  // get the value for the maximal uploadable filesize from the php.ini (if available)
503  $umf = ini_get("upload_max_filesize");
504  // get the value for the maximal post data from the php.ini (if available)
505  $pms = ini_get("post_max_size");
506 
507  //convert from short-string representation to "real" bytes
508  $multiplier_a=array("K"=>1024, "M"=>1024*1024, "G"=>1024*1024*1024);
509 
510  $umf_parts=preg_split("/(\d+)([K|G|M])/", $umf, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
511  $pms_parts=preg_split("/(\d+)([K|G|M])/", $pms, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
512 
513  if (count($umf_parts) == 2) { $umf = $umf_parts[0]*$multiplier_a[$umf_parts[1]]; }
514  if (count($pms_parts) == 2) { $pms = $pms_parts[0]*$multiplier_a[$pms_parts[1]]; }
515 
516  // use the smaller one as limit
517  $max_filesize = min($umf, $pms);
518 
519  if (!$max_filesize) $max_filesize=max($umf, $pms);
520 
521  //format for display in mega-bytes
522  $max_filesize = sprintf("%.1f MB",$max_filesize/1024/1024);
523 
524  return $max_filesize;
525  }
526 
530  function getDeletionFlag()
531  {
532  if ($_POST[$this->getPostVar()."_delete"])
533  {
534  return true;
535  }
536  return false;
537  }
538 
542  function getToolbarHTML()
543  {
544  $html = $this->render("toolbar");
545  return $html;
546  }
547 
548  static function setPersonalWorkspaceQuotaCheck($a_value)
549  {
550  if((bool)$a_value)
551  {
552  include_once "Services/WebDAV/classes/class.ilDiskQuotaActivationChecker.php";
554  {
555  self::$check_wsp_quota = true;
556  return;
557  }
558  }
559  self::$check_wsp_quota = false;
560  }
561 }
getSuffixes()
Get Accepted Suffixes.
$error
Definition: Error.php:17
__construct($a_title="", $a_postvar="")
Constructor.
static virusHandling($a_file, $a_orig_name="", $a_clean=true)
scan file for viruses and clean files if possible
render($a_mode="")
Render html.
setALlowDeletion($a_val)
Set allow deletion.
getPostVar()
Get Post Variable.
getFileNamePostVar()
Get file name post var.
This class represents a file property in a property form.
static normalizeUtf8String($a_str)
Normalize UTF8 string.
getToolbarHTML()
Get HTML for toolbar.
Interface for property form input GUI classes that can be used in ilToolbarGUI.
getFilename()
Get Value.
getPending()
Get pending filename.
setSize($a_size)
Set Size.
getALlowDeletion()
Get allow deletion.
getForbiddenSuffixes()
Get Accepted Suffixes.
setAlert($a_alert)
Set Alert Text.
getDeletionFlag()
Get deletion flag.
setType($a_type)
Set Type.
isFileNameSelectionEnabled()
Check if filename selection is enabled.
setValue($a_value)
Set Value.
insert($a_tpl)
Insert property html.
checkInput()
Check input, strip slashes etc.
font size
Definition: langcheck.php:162
static setPersonalWorkspaceQuotaCheck($a_value)
getFieldId()
Get Post Variable.
setFilename($a_val)
Set filename value (if filename selection is enabled)
special template class to simplify handling of ITX/PEAR
setPending($a_val)
Set pending filename value.
static isUploadPossible($a_additional_size=null)
enableFileNameSelection($a_post_var)
If enabled, users get the possibility to enter a filename for the uploaded file.
setForbiddenSuffixes($a_suffixes)
Set forbidden Suffixes.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
setHiddenTitle($a_val)
Set hidden title (for screenreaders)
outputSuffixes($a_tpl, $a_block="allowed_suffixes")
Create styles array
The data for the language used.
setValueByArray($a_values)
Set value by array.
This class represents a property that may include a sub form.
global $lng
Definition: privfeed.php:17
setSuffixes($a_suffixes)
Set Accepted Suffixes.
$_POST["username"]
$html
Definition: example_001.php:87