File: D:/HostingSpaces/SBogers64/klimroosbudel.nl/wwwroot/kms/lib/files/file_handler.class.php
<?php
/**
* file_handler.class.php
* Created by Komma Mediadesign.
* Author: mike
* Date: 4/15/13
*/
class File_Handler
{
/*
* Name of this file handler. Used f.e. in the session name.
*/
private $_name = 'images';
/*
* Maximum images allowed in the session
*/
private $_maxImages = 0;
/*
* Name of the table we're working in
*/
private $_tableName;
/*
* Image dimensions
* Large Width, Large Height, Thumb Width, Thumb Height, KMS Thumb Width, KMS Thumb Height.
*/
private $_dim = ['lw'=>null,
'lh'=>null,
'tw'=>null,
'th'=>null,
'kw'=>90,
'kh'=>90, ];
/*
* Holds all errors that occur.
*/
private $_errors = [];
/*
* Constructor
*/
public function __construct()
{
}
/*
* Set
*/
public function set($prop, $val)
{
if (! empty($prop)) {
$this->{$prop} = $val;
}
}
/*
* Get
*/
public function get($prop)
{
if (! empty($prop)) {
return $this->{$prop};
}
return false;
}
/*
* Add images to the current Session.
*/
public function add()
{
// Check if any images are selected
if (empty($_FILES['images'])) {
$this->_errors[] = 'No images.';
return false;
}
// Crop images?
$crop = false;
// Get current session image_data
$arr = Session::get($this->_name.'_data');
is_array($arr) ? $numImages = count($arr) : $numImages = 0;
// Check for each image if it is valid
foreach ($_FILES['images']['name'] as $key => $name) {
// Create file array
$file = ['name'=>$_FILES['images']['name'][$key],
'tmp_name'=>$_FILES['images']['tmp_name'][$key],
'size'=>$_FILES['images']['size'][$key], ];
// Check for name
if (! empty($name)) {
// Check if max images is reached
if ($numImages == $this->_maxImages && $this->_maxImages != 0) {
$this->_errors[] = $file['name'].': Max images reached.';
return false;
}
// Add a File_Uploader class and validate the image.
$FileUploader = new File_Uploader($file);
if ($FileUploader->Validate()) {
if ($tempFile = $FileUploader->upload()) {
$fileExt = $FileUploader->getExt($tempFile);
switch($fileExt) {
case 'jpg':
case 'jpeg':
case 'gif':
case 'png':
if (! $crop) {
// Create images
$this->createImages($tempFile, $key);
} else {
// crop by hand
$_SESSION['images_to_crop'][]['original'] = $tempFile;
}
break;
case 'pdf':
case 'doc':
case 'zip':
break;
}
}
}
} else {
$this->_errors[] = $file['name'].': Empty name.';
}
}
if (count($this->_errors) == 0) {
return true;
}
return false;
}
/*
* Create images from a temp file
*/
private function createImages($tempFile, $key)
{
$temp = explode('.', $tempFile);
$fileExt = strtolower($temp[count($temp) - 1]);
// set data
$data = [];
$data['short_code'] = $key.time();
$data['filename'] = FILE_PREFIX.'_'.$data['short_code'].'.'.$fileExt;
$data['thumb'] = FILE_PREFIX.'_'.$data['short_code'].'_thumb.'.$fileExt;
$data['kms_thumb'] = FILE_PREFIX.'_'.$data['short_code'].'_kms_thumb.'.$fileExt;
$data['caption'] = '';
// add data to session
$count = 0;
if ($images = Session::get($this->_name.'_data')) {
$count = count($images);
}
$key = [$this->_name.'_data', $count];
Session::set($key, $data);
list($tempW, $tempH) = getimagesize(DOCUMENT_UPLOADS_ROOT.$tempFile);
if (($tempW / $tempH) < 0.5) {
$this->_dim['lw'] = null;
$this->_dim['lh'] = 1000;
$this->_dim['tw'] = null;
$this->_dim['th'] = 420;
}
// Create large image
$imageCropper = new Image_Cropper(DOCUMENT_UPLOADS_ROOT.$tempFile, $data['filename']);
$imageCropper->setSides($this->_dim['lw'], $this->_dim['lh']);
$imageCropper->createImage();
// Check if a thumbnail is necessary
if ($this->_dim['tw'] != null || $this->_dim['th'] != null) {
$imageCropper->setName($data['thumb']);
$imageCropper->setSides($this->_dim['tw'], $this->_dim['th']);
$imageCropper->createImage();
} else {
// if no thumb necessary, set large image as thumb data to avoid problems.
$data['thumb'] = $data['filename'];
}
// Create a thumbnail for the backend.
$imageCropper->setName($data['kms_thumb']);
$imageCropper->setSides($this->_dim['kw'], $this->_dim['kh']);
$imageCropper->createImage();
// Unlink the temporary file.
$this->unlink(DOCUMENT_UPLOADS_ROOT.$tempFile);
}
/**
* Unlink the image
*
* @param string
* @return bool
*/
public function unlink($path)
{
if (! empty($path) && is_file($path)) {
unlink($path);
}
}
/*
* Clean up images which are not in the database, but still in the session.
*/
public function clean($pageName)
{
// Check the session for images which are not in the database.
$sessionImages = Session::get($this->_name.'_data');
if (is_array($sessionImages)) {
foreach ($sessionImages as $key => $sessionImage) {
$this->remove($pageName, $key);
}
}
// Destroy image session
Session::destroy($this->_name.'_data');
}
/*
* Remove image from a session if it doesn't exist in db
*/
public function remove($pageName, $key)
{
// what image to remove
$sessionImage = Session::get([$this->_name.'_data', $key]);
if (is_array($sessionImage)) {
// if not in the database
$FileStorage = new File_Storage();
$FileStorage->set('_fileSessionName', $this->_name.'_data');
$FileStorage->set('_tableName', TABLE_PREFIX.$pageName.'_images');
if (! $FileStorage->get('short_code', $sessionImage['short_code'])) {
if (! empty($sessionImage['filename']) && ! empty($sessionImage['thumb']) && ! empty($sessionImage['kms_thumb'])) {
$this->unlink(DOCUMENT_UPLOADS_ROOT.$sessionImage['filename']);
$this->unlink(DOCUMENT_UPLOADS_ROOT.$sessionImage['thumb']);
$this->unlink(DOCUMENT_UPLOADS_ROOT.$sessionImage['kms_thumb']);
}
}
}
}
/*
* Set image session.
*/
public function fillSession()
{
$FileStorage = new File_Storage();
$FileStorage->set('_fileSessionName', $this->_name.'_data');
$FileStorage->set('_tableName', $this->_tableName);
$key = $value = null;
if (defined('URL_SUB2')) {
// set item id
$key = 'itemId';
$value = URL_SUB2;
}
if ($images = $FileStorage->get($key, $value)) {
$sessionKey = $this->_name.'_data';
if (! isset($_SESSION[$sessionKey])) {
Session::set($sessionKey, $images);
}
}
}
}