/** * Handles an uploaded file, stores it to the correct folder, adds an entry * to the database and returns a TBGFile object * * @param string $thefile The request parameter the file was sent as * * @return TBGFile The TBGFile object */ public function handleUpload($key) { $apc_exists = self::CanGetUploadStatus(); if ($apc_exists && !array_key_exists($this->getParameter('APC_UPLOAD_PROGRESS'), $_SESSION['__upload_status'])) { $_SESSION['__upload_status'][$this->getParameter('APC_UPLOAD_PROGRESS')] = array('id' => $this->getParameter('APC_UPLOAD_PROGRESS'), 'finished' => false, 'percent' => 0, 'total' => 0, 'complete' => 0); } try { if ($this->getUploadedFile($key) !== null) { $thefile = $this->getUploadedFile($key); if (TBGSettings::isUploadsEnabled()) { TBGLogging::log('Uploads enabled'); if ($thefile['error'] == UPLOAD_ERR_OK) { TBGLogging::log('No upload errors'); if (filesize($thefile['tmp_name']) > TBGSettings::getUploadsMaxSize(true) && TBGSettings::getUploadsMaxSize() > 0) { throw new Exception(TBGContext::getI18n()->__('You cannot upload files bigger than %max_size% MB', array('%max_size%' => TBGSettings::getUploadsMaxSize()))); } TBGLogging::log('Upload filesize ok'); $extension = substr(basename($thefile['name']), strpos(basename($thefile['name']), '.')); if ($extension == '') { TBGLogging::log('OOps, could not determine upload filetype', 'main', TBGLogging::LEVEL_WARNING_RISK); //throw new Exception(TBGContext::getI18n()->__('Could not determine filetype')); } else { TBGLogging::log('Checking uploaded file extension'); $extension = substr($extension, 1); $upload_extensions = TBGSettings::getUploadsExtensionsList(); if (TBGSettings::getUploadsRestrictionMode() == 'blacklist') { TBGLogging::log('... using blacklist'); foreach ($upload_extensions as $an_ext) { if (strtolower(trim($extension)) == strtolower(trim($an_ext))) { TBGLogging::log('Upload extension not ok'); throw new Exception(TBGContext::getI18n()->__('This filetype is not allowed')); } } TBGLogging::log('Upload extension ok'); } else { TBGLogging::log('... using whitelist'); $is_ok = false; foreach ($upload_extensions as $an_ext) { if (strtolower(trim($extension)) == strtolower(trim($an_ext))) { TBGLogging::log('Upload extension ok'); $is_ok = true; break; } } if (!$is_ok) { TBGLogging::log('Upload extension not ok'); throw new Exception(TBGContext::getI18n()->__('This filetype is not allowed')); } } /*if (in_array(strtolower(trim($extension)), array('php', 'asp'))) { TBGLogging::log('Upload extension is php or asp'); throw new Exception(TBGContext::getI18n()->__('This filetype is not allowed')); }*/ } if (is_uploaded_file($thefile['tmp_name'])) { TBGLogging::log('Uploaded file is uploaded'); $files_dir = TBGSettings::getUploadsLocalpath(); $new_filename = TBGContext::getUser()->getID() . '_' . NOW . '_' . basename($thefile['name']); TBGLogging::log('Moving uploaded file to ' . $new_filename); if (!move_uploaded_file($thefile['tmp_name'], $files_dir . $new_filename)) { TBGLogging::log('Moving uploaded file failed!'); throw new Exception(TBGContext::getI18n()->__('An error occured when saving the file')); } else { TBGLogging::log('Upload complete and ok, storing upload status and returning filename ' . $new_filename); $content_type = TBGFile::getMimeType($files_dir . $new_filename); $file = new TBGFile(); $file->setRealFilename($new_filename); $file->setOriginalFilename(basename($thefile['name'])); $file->setContentType($content_type); $file->setDescription($this->getParameter($key . '_description')); if (TBGSettings::getUploadStorage() == 'database') { $file->setContent(file_get_contents($files_dir . $new_filename)); } $file->save(); //$file = TBGFile::createNew($new_filename, basename($thefile['name']), $content_type, $this->getParameter($key.'_description'), ((TBGSettings::getUploadStorage() == 'database') ? file_get_contents($files_dir.$new_filename) : null)); if ($apc_exists) { $_SESSION['__upload_status'][$this->getParameter('APC_UPLOAD_PROGRESS')] = array('id' => $this->getParameter('APC_UPLOAD_PROGRESS'), 'finished' => true, 'percent' => 100, 'total' => 0, 'complete' => 0, 'file_id' => $file->getID()); } return $file; } } else { TBGLogging::log('Uploaded file was not uploaded correctly'); throw new Exception(TBGContext::getI18n()->__('The file was not uploaded correctly')); } } else { TBGLogging::log('Upload error: ' . $thefile['error']); switch ($thefile['error']) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new Exception(TBGContext::getI18n()->__('You cannot upload files bigger than %max_size% MB', array('%max_size%' => TBGSettings::getUploadsMaxSize()))); break; case UPLOAD_ERR_PARTIAL: throw new Exception(TBGContext::getI18n()->__('The upload was interrupted, please try again')); break; case UPLOAD_ERR_NO_FILE: throw new Exception(TBGContext::getI18n()->__('No file was uploaded')); break; default: throw new Exception(TBGContext::getI18n()->__('An unhandled error occured') . ': ' . $thefile['error']); break; } } } else { TBGLogging::log('Uploads not enabled'); throw new Exception(TBGContext::getI18n()->__('Uploads are not enabled')); } TBGLogging::log('Uploaded file could not be uploaded'); throw new Exception(TBGContext::getI18n()->__('The file could not be uploaded')); } TBGLogging::log('Could not find uploaded file' . $key); throw new Exception(TBGContext::getI18n()->__('Could not find the uploaded file. Please make sure that it is not too big.')); } catch (Exception $e) { TBGLogging::log('Upload exception: ' . $e->getMessage()); if ($apc_exists) { $_SESSION['__upload_status'][$this->getParameter('APC_UPLOAD_PROGRESS')]['error'] = $e->getMessage(); $_SESSION['__upload_status'][$this->getParameter('APC_UPLOAD_PROGRESS')]['finished'] = true; $_SESSION['__upload_status'][$this->getParameter('APC_UPLOAD_PROGRESS')]['percent'] = 100; } throw $e; } }
</td> </tr> <tr> <td class="config_explanation" colspan="2"><?php echo __('When uploads are disabled, users will not be able to attach files to issues or upload documents, images or PDFs in project planning. More fine-grained permissions are available from the permissions configuration.'); ?> </td> </tr> <tr> <td><label for="upload_max_file_size"><?php echo __('Max upload file size'); ?> </label></td> <td> <input type="text" name="upload_max_file_size" id="upload_max_file_size" style="width: 50px;" value="<?php echo TBGSettings::getUploadsMaxSize(); ?> "<?php if (!TBGSettings::isUploadsEnabled()) { ?> disabled<?php } ?> > <?php echo __('MB'); ?> </td> </tr> <tr> <td class="config_explanation" colspan="2"> <?php
?> "> <input type="hidden" name ="MAX_FILE_SIZE" value="<?php echo TBGSettings::getUploadsMaxSize(true); ?> "> <input type="hidden" name="APC_UPLOAD_PROGRESS" value="" /> <div> <dl> <dt style="width: 120px;"><label for="uploader_file"><?php echo __('Select a file'); ?> </label></dt> <dd style="margin-bottom: 3px;"><input type="file" name="uploader_file" id="uploader_file"></dd> <dd style="width: 100%;"><?php echo __('Files bigger than %max_filesize% can not be attached. Please check that the file you are attaching is not bigger than this.', array('%max_filesize%' => '<b>' . TBGSettings::getUploadsMaxSize() . 'MB</b>')); ?> </dd> <dt style="width: 120px;"><label for="upload_file_description"><?php echo __('Describe the file'); ?> </label></dt> <dd style="margin-bottom: 3px;"><input type="text" name="uploader_file_description" id="upload_file_description" style="width: 340px;"></dd> <dd class="faded_out" style="width: 100%;"><?php echo __('Enter a few words about the file, so people can understand what it is/does'); ?> </dd> <?php if ($mode == 'issue') { ?> <dt style="width: 120px;"><label for="upload_file_comment"><?php