Files
icehrm/core/src/Classes/Upload/Uploader.php
2020-05-20 18:47:29 +02:00

160 lines
5.7 KiB
PHP

<?php
namespace Classes\Upload;
use Classes\BaseService;
use Classes\FileService;
use Classes\IceResponse;
use Classes\S3FileSystem;
use Classes\SettingsManager;
use Model\File;
use Utils\LogManager;
class Uploader
{
private $allowedExtensions = array();
private $sizeLimit = 10485760;
private $file;
public function __construct($file, array $allowedExtensions = array(), $sizeLimit = 10485760)
{
$allowedExtensions = array_map("strtolower", $allowedExtensions);
$this->allowedExtensions = $allowedExtensions;
$this->sizeLimit = $sizeLimit;
$this->file = $file;
}
protected function handleUpload($uploadDirectory, $saveFileName, $replaceOldFile = false)
{
if (!is_writable($uploadDirectory)) {
return new IceResponse(
IceResponse::ERROR,
"Server error. Upload directory ($uploadDirectory) is not writable"
);
}
if (!$this->file) {
return new IceResponse(
IceResponse::ERROR,
'No files were uploaded.'
);
}
$size = $this->file->getSize();
LogManager::getInstance()->info('file size ='.$size);
LogManager::getInstance()->info('file size limit ='.$this->sizeLimit);
if ($size == 0) {
return new IceResponse(
IceResponse::ERROR,
'File is empty'
);
}
if ($size > $this->sizeLimit) {
return new IceResponse(
IceResponse::ERROR,
'File is too large'
);
}
$pathinfo = pathinfo($this->file->getName());
$ext = $pathinfo['extension'];
if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
$these = implode(', ', $this->allowedExtensions);
return new IceResponse(
IceResponse::ERROR,
'File has an invalid extension, it should be one of '. $these . '.'
);
}
$saveFileName = $saveFileName.'.'.strtolower($ext);
$finalFileLocation = $uploadDirectory . $saveFileName;
if ($this->file->save($finalFileLocation)) {
$arr = explode("/", $finalFileLocation);
return new IceResponse(
IceResponse::SUCCESS,
$arr[count($arr)-1]
);
//return array('success'=>1,'filename'=>$arr[count($arr)-1],'error'=>'');
} else {
return new IceResponse(
IceResponse::ERROR,
'The upload was cancelled, or server error encountered'
);
}
}
public static function upload($postData, $fileData)
{
//Generate File Name
$saveFileName = $postData['file_name'];
$saveFileName = str_replace("..", "", $saveFileName);
$saveFileName = str_replace("/", "", $saveFileName);
if (stristr($saveFileName, ".php")) {
$saveFileName = str_replace(".php", "", $saveFileName);
}
if (empty($saveFileName) || $saveFileName == "_NEW_") {
$saveFileName = microtime();
$saveFileName = str_replace(".", "", $saveFileName);
$saveFileName = str_replace(" ", "", $saveFileName);
}
$file = new File();
$file->Load("name = ?", array($saveFileName));
$allowedExtensions = explode(',', "csv,doc,xls,docx,xlsx,txt,ppt,pptx,rtf,pdf,xml,jpg,bmp,gif,png,jpeg");
// max file size in bytes
$sizeLimit =MAX_FILE_SIZE_KB * 1024;
$uploader = new Uploader(new TempFile($fileData), $allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload(CLIENT_BASE_PATH.'data/', $saveFileName);
if ($result->getStatus() !== IceResponse::SUCCESS) {
return $result;
}
$uploadFilesToS3 = SettingsManager::getInstance()->getSetting("Files: Upload Files to S3");
$uploadFilesToS3Key = SettingsManager::getInstance()->getSetting("Files: Amazon S3 Key for File Upload");
$uploadFilesToS3Secret = SettingsManager::getInstance()->getSetting(
"Files: Amazone S3 Secret for File Upload"
);
$s3Bucket = SettingsManager::getInstance()->getSetting("Files: S3 Bucket");
$s3WebUrl = SettingsManager::getInstance()->getSetting("Files: S3 Web Url");
$localFile = CLIENT_BASE_PATH.'data/'.$result->getData();
$uploadedFileSize = filesize($localFile);
if ($uploadFilesToS3.'' == '1' && !empty($uploadFilesToS3Key) && !empty($uploadFilesToS3Secret) &&
!empty($s3Bucket) && !empty($s3WebUrl)) {
$uploadName = CLIENT_NAME."/".$result->getData();
LogManager::getInstance()->info("Upload file to s3:".$uploadName);
LogManager::getInstance()->info("Local file:".$localFile);
LogManager::getInstance()->info("Local file size:".$uploadedFileSize);
$s3FileSys = new S3FileSystem($uploadFilesToS3Key, $uploadFilesToS3Secret);
$res = $s3FileSys->putObject($s3Bucket, $uploadName, $localFile, 'authenticated-read');
LogManager::getInstance()->info("Response from s3 file sys:".print_r($res, true));
unlink($localFile);
}
$file->name = $saveFileName;
$file->filename = $result->getData();
$signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME;
$file->$signInMappingField = $postData['user']=="_NONE_"?null:$postData['user'];
$file->file_group = $postData['file_group'];
$file->size = $uploadedFileSize;
$file->size_text = FileService::getInstance()->getReadableSize($uploadedFileSize);
$file->Save();
return new IceResponse(
IceResponse::SUCCESS,
$saveFileName
);
}
}