233 lines
5.8 KiB
PHP
233 lines
5.8 KiB
PHP
<?php
|
|
require_once(LIBDIR."/mvcfronk/mfUpload/mfUpload_TmpFile.php");
|
|
|
|
class mfUpload {
|
|
private $log;
|
|
private $upload;
|
|
private $size;
|
|
private $savepath;
|
|
private $original_filename;
|
|
private $filename;
|
|
private $dirmode;
|
|
private $filemode;
|
|
|
|
|
|
public function __construct($uplName,$randomFileName=true) {
|
|
$this->log = mfLoghandler::singleton();
|
|
|
|
$this->dirmode = 0777;
|
|
$this->filemode = 0666;
|
|
|
|
if(defined("MFUPLOAD_DIRMODE")) {
|
|
$this->dirmode = MFUPLOAD_DIRMODE;
|
|
}
|
|
|
|
if(defined("MFUPLOAD_FILEMODE")) {
|
|
$this->filemode = MFUPLOAD_FILEMODE;
|
|
}
|
|
|
|
if(!$this->upload = new mfUpload_TmpFile($uplName)) {
|
|
throw new Exception($this->upload->errormessage);
|
|
}
|
|
|
|
$this->original_filename = $this->upload->filename;
|
|
|
|
if(!$this->filename = $this->upload->getFilename()){
|
|
throw new Exception($this->upload->errormessage);
|
|
}
|
|
|
|
if($randomFileName) {
|
|
$this->filename = self::getRandomFilename().'-'.$this->filename;
|
|
}
|
|
|
|
$this->size = $this->upload->getFileSize();
|
|
if($this->size > MFUPLOAD_FILE_MAX_SIZE) {
|
|
throw new Exception('File is too big. Maximum allowed filesize is '.(MFUPLOAD_FILE_MAX_SIZE).' MB');
|
|
}
|
|
}
|
|
|
|
static public function handleFormUpload($uplName, $filename = false, $subfolder = false, $savepath = MFUPLOAD_FILE_SAVE_PATH) {
|
|
if(!isset($_FILES) || !array_key_exists($uplName, $_FILES)) {
|
|
throw new Exception("Uploaded file not found");
|
|
}
|
|
if(array_key_exists("error", $_FILES[$uplName]) && $_FILES[$uplName]['error']) {
|
|
throw new Exception("Error receiving file");
|
|
}
|
|
|
|
$upload_error = false;
|
|
|
|
$savepath = preg_replace('#/+$#', "", $savepath); // remove trailing slash
|
|
if($subfolder) {
|
|
$subfolder = preg_replace('#^/+#', "", $subfolder); // remove leading slash
|
|
$subfolder = preg_replace('#/+$#', "", $subfolder); // remove trailing slash
|
|
$savepath .= "/$subfolder";
|
|
}
|
|
|
|
$upload = new mfUpload($uplName);
|
|
$upload->setSavepath($savepath);
|
|
|
|
if(!$upload->getSize()) {
|
|
throw new Exception("Datei darf nicht leer sein");
|
|
}
|
|
|
|
if(substr(strtolower($upload->getFilename()), -3, 3) == "pdf" && !$upload->validatePDF()) {
|
|
throw new Exception("PDF-Validierung fehlgeschlagen");
|
|
}
|
|
|
|
try {
|
|
$upload->save();
|
|
} catch (Exception $ex) {
|
|
throw $ex;
|
|
}
|
|
|
|
$file_data = [];
|
|
$file_data['name'] = ($filename) ? $filename : $upload->getOriginalFilename();
|
|
$file_data['filename'] = ($filename) ? $filename : $upload->getOriginalFilename();
|
|
$file_data['subfolder'] = $subfolder;
|
|
$file_data['store_filename'] = $upload->getFilename();
|
|
$file_data['orig_filename'] = $upload->getOriginalFilename();
|
|
|
|
$file = FileModel::create($file_data);
|
|
$file_id = $file->save();
|
|
if(!$file_id) {
|
|
unlink($upload->getSavepath()."/".$upload->getFilename());
|
|
throw new Exception("Datei konnte nicht angelegt werden");
|
|
}
|
|
|
|
return $file;
|
|
|
|
}
|
|
|
|
public function getSavepath() {
|
|
return $this->savepath;
|
|
}
|
|
|
|
public function setSavepath($path) {
|
|
$this->savepath = $path;
|
|
return true;
|
|
}
|
|
|
|
public function getOriginalFilename() {
|
|
return $this->original_filename;
|
|
}
|
|
|
|
public function getFilename() {
|
|
return $this->filename;
|
|
}
|
|
|
|
public function setFilename($name) {
|
|
$this->filename = $name;
|
|
}
|
|
|
|
public function getSize() {
|
|
return $this->size;
|
|
}
|
|
|
|
public function getDirmode() {
|
|
return $this->dirmode;
|
|
}
|
|
|
|
public function setDirmode($mode) {
|
|
$this->dirmode = $mode;
|
|
}
|
|
|
|
public function getFilemode() {
|
|
return $this->filemode;
|
|
}
|
|
|
|
public function setFilemode($mode) {
|
|
$this->filemode = $mode;
|
|
}
|
|
|
|
public function getMimetype() {
|
|
return $this->upload->getMimetype();
|
|
}
|
|
|
|
public function save() {
|
|
if(!$this->savepath) {
|
|
if(!$this->buildSavepath()) {
|
|
throw new Exception ("Not enough data to build savepath!",605);
|
|
}
|
|
}
|
|
if(!$this->upload->move_upload($this->savepath."/".$this->filename)) {
|
|
throw new Exception ("Unable to move temp file: ".$this->upload->errormessage,605);
|
|
}
|
|
|
|
chmod($this->savepath."/".$this->filename,$this->filemode);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
private function buildSavepath() {
|
|
if(!$this->filename) {
|
|
return false;
|
|
}
|
|
|
|
$savepath = MFUPLOAD_FILE_SAVE_PATH;
|
|
if(!MFUPLOAD_FILE_SAVE_PATH) {
|
|
$savepath = "upload/";
|
|
}
|
|
|
|
$this->log->debug("dirmode: ".decoct($this->dirmode));
|
|
if(!file_exists($savepath)) {
|
|
if(!mkdir($savepath, $this->dirmode,true)) {
|
|
throw new Exception("Error creating directory $savepath.");
|
|
}
|
|
chmod($savepath, $this->dirmode);
|
|
}
|
|
if(!is_dir($savepath)) {
|
|
throw new Exception("Upload save path not a directory!");
|
|
}
|
|
|
|
$this->savepath = $savepath;
|
|
return true;
|
|
}
|
|
|
|
public static function getRandomFilename() {
|
|
$length = 20;
|
|
$characters = '0123456789abcdef';
|
|
$string = '';
|
|
|
|
for ($p = 0; $p < $length; $p++) {
|
|
$string .= $characters[mt_rand(0, strlen($characters) -1)];
|
|
}
|
|
|
|
$rand = uniqid(md5(rand()), true);
|
|
list($rand) = explode('.',$rand);
|
|
|
|
$string=$rand.$string;
|
|
return $string;
|
|
}
|
|
|
|
public function validatePDF() {
|
|
if(!$this->upload) {
|
|
return false;
|
|
}
|
|
|
|
if(!$this->size) {
|
|
return false;
|
|
}
|
|
$this->log->debug("upload size: ".$this->size);
|
|
|
|
$mime = $this->upload->getMimetype();
|
|
$this->log->debug("upload mime: $mime");
|
|
if(!stripos($mime, "pdf")) {
|
|
return false;
|
|
}
|
|
|
|
$pdftext = $this->upload->pdftotext();
|
|
|
|
//$this->log->debug("text: ".$pdftext);
|
|
if($pdftext === false) {
|
|
$this->log->warn("pdftotext returned error (".$this->filename.")");
|
|
return false;
|
|
}
|
|
|
|
//$this->log->debug("upload text: $pdftext");
|
|
return true;
|
|
}
|
|
|
|
|
|
}
|