diff options
author | Frédéric Guillot <fred@kanboard.net> | 2014-05-22 20:58:21 -0400 |
---|---|---|
committer | Frédéric Guillot <fred@kanboard.net> | 2014-05-22 20:58:21 -0400 |
commit | 40917992e775bd21a280eb267241c452e04e5ade (patch) | |
tree | c1bf82ab83564bc9ca749f026f54342cbd35374f /app/Model/File.php | |
parent | 2230dd4e6b148346c0ec596b9e3e12996a762ed8 (diff) |
Add files upload
Diffstat (limited to 'app/Model/File.php')
-rw-r--r-- | app/Model/File.php | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/app/Model/File.php b/app/Model/File.php new file mode 100644 index 00000000..1e2e1432 --- /dev/null +++ b/app/Model/File.php @@ -0,0 +1,176 @@ +<?php + +namespace Model; + +use SimpleValidator\Validator; +use SimpleValidator\Validators; + +/** + * File model + * + * @package model + * @author Frederic Guillot + */ +class File extends Base +{ + /** + * SQL table name + * + * @var string + */ + const TABLE = 'task_has_files'; + + /** + * Directory where are stored files + * + * @var string + */ + const BASE_PATH = 'data/files/'; + + /** + * Get a file by the id + * + * @access public + * @param integer $file_id File id + * @return array + */ + public function getById($file_id) + { + return $this->db->table(self::TABLE)->eq('id', $file_id)->findOne(); + } + + /** + * Remove a file + * + * @access public + * @param integer $file_id File id + * @return bool + */ + public function remove($file_id) + { + $file = $this->getbyId($file_id); + + if (! empty($file) && @unlink(self::BASE_PATH.$file['path'])) { + return $this->db->table(self::TABLE)->eq('id', $file_id)->remove(); + } + + return false; + } + + /** + * Create a file entry in the database + * + * @access public + * @param integer $task_id Task id + * @param string $name Filename + * @param string $path Path on the disk + * @param bool $is_image Image or not + * @return bool + */ + public function create($task_id, $name, $path, $is_image) + { + return $this->db->table(self::TABLE)->save(array( + 'task_id' => $task_id, + 'name' => $name, + 'path' => $path, + 'is_image' => $is_image ? '1' : '0', + )); + } + + /** + * Get all files for a given task + * + * @access public + * @param integer $task_id Task id + * @return array + */ + public function getAll($task_id) + { + return $listing = $this->db->table(self::TABLE) + ->eq('task_id', $task_id) + ->asc('name') + ->findAll(); + } + + /** + * Check if a filename is an image + * + * @access public + * @param string $filename Filename + * @return bool + */ + public function isImage($filename) + { + return getimagesize($filename) !== false; + } + + /** + * Generate the path for a new filename + * + * @access public + * @param integer $project_id Project id + * @param integer $task_id Task id + * @param string $filename Filename + * @return bool + */ + public function generatePath($project_id, $task_id, $filename) + { + return $project_id.DIRECTORY_SEPARATOR.$task_id.DIRECTORY_SEPARATOR.hash('sha1', $filename.time()); + } + + /** + * Check if the base directory is created correctly + * + * @access public + */ + public function setup() + { + if (! is_dir(self::BASE_PATH)) { + if (! mkdir(self::BASE_PATH, 0755, true)) { + die('Unable to create the upload directory: "'.self::BASE_PATH.'"'); + } + } + + if (! is_writable(self::BASE_PATH)) { + die('The directory "'.self::BASE_PATH.'" must be writeable by your webserver user'); + } + } + + /** + * Handle file upload + * + * @access public + * @param integer $project_id Project id + * @param integer $task_id Task id + * @param string $form_name File form name + */ + public function upload($project_id, $task_id, $form_name) + { + $this->setup(); + + if (! empty($_FILES[$form_name])) { + + foreach ($_FILES[$form_name]['error'] as $key => $error) { + + if ($error == UPLOAD_ERR_OK && $_FILES[$form_name]['size'][$key] > 0) { + + $original_filename = basename($_FILES[$form_name]['name'][$key]); + $uploaded_filename = $_FILES[$form_name]['tmp_name'][$key]; + $destination_filename = $this->generatePath($project_id, $task_id, $original_filename); + + @mkdir(self::BASE_PATH.dirname($destination_filename), 0755, true); + + if (@move_uploaded_file($uploaded_filename, self::BASE_PATH.$destination_filename)) { + + $this->create( + $task_id, + $original_filename, + $destination_filename, + $this->isImage(self::BASE_PATH.$destination_filename) + ); + } + } + } + } + } +} |