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
4include_once 'Services/UIComponent/Toolbar/interfaces/interface.ilToolbarItem.php';
5include_once("./Services/Form/classes/class.ilSubEnabledFormPropertyGUI.php");
6
15{
16 private $filename;
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
200 {
201 return $this->filename_selection ? true : false;
202 }
203
211 public function getFileNamePostVar()
212 {
214 }
215
221 function setALlowDeletion($a_val)
222 {
223 $this->allow_deletion = $a_val;
224 }
225
232 {
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
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}
sprintf('%.4f', $callTime)
$error
Definition: Error.php:17
$_POST["username"]
An exception for terminatinating execution or to throw for unit testing.
static isUploadPossible($a_additional_size=null)
This class represents a file property in a property form.
static setPersonalWorkspaceQuotaCheck($a_value)
getForbiddenSuffixes()
Get Accepted Suffixes.
setValueByArray($a_values)
Set value by array.
enableFileNameSelection($a_post_var)
If enabled, users get the possibility to enter a filename for the uploaded file.
setValue($a_value)
Set Value.
outputSuffixes($a_tpl, $a_block="allowed_suffixes")
setFilename($a_val)
Set filename value (if filename selection is enabled)
setPending($a_val)
Set pending filename value.
__construct($a_title="", $a_postvar="")
Constructor.
getSuffixes()
Get Accepted Suffixes.
getDeletionFlag()
Get deletion flag.
setForbiddenSuffixes($a_suffixes)
Set forbidden Suffixes.
setSuffixes($a_suffixes)
Set Accepted Suffixes.
isFileNameSelectionEnabled()
Check if filename selection is enabled.
setSize($a_size)
Set Size.
getFileNamePostVar()
Get file name post var.
insert($a_tpl)
Insert property html.
render($a_mode="")
Render html.
getToolbarHTML()
Get HTML for toolbar.
setALlowDeletion($a_val)
Set allow deletion.
getPending()
Get pending filename.
getALlowDeletion()
Get allow deletion.
checkInput()
Check input, strip slashes etc.
setType($a_type)
Set Type.
getPostVar()
Get Post Variable.
setAlert($a_alert)
Set Alert Text.
getFieldId()
Get Post Variable.
setHiddenTitle($a_val)
Set hidden title (for screenreaders)
static normalizeUtf8String($a_str)
Normalize UTF8 string.
This class represents a property that may include a sub form.
special template class to simplify handling of ITX/PEAR
static virusHandling($a_file, $a_orig_name="", $a_clean=true)
scan file for viruses and clean files if possible
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
$html
Definition: example_001.php:87
Interface for property form input GUI classes that can be used in ilToolbarGUI.
font size
Definition: langcheck.php:162
global $lng
Definition: privfeed.php:17
echo;exit;}function LogoutNotification($SessionID) { global $ilDB; $q="SELECT session_id, data FROM usr_session WHERE expires > (\w+)\|/" PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE