PageRenderTime 52ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/class_files_upload.php

http://github.com/MightyGorgon/icy_phoenix
PHP | 188 lines | 131 code | 19 blank | 38 comment | 25 complexity | 830ab4a168781903c19295faba4a9f0f MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package Icy Phoenix
  5. * @version $Id$
  6. * @copyright (c) 2008 Icy Phoenix
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. if (!defined('IN_ICYPHOENIX'))
  11. {
  12. die('Hacking attempt');
  13. }
  14. if (!defined('POSTED_IMAGES_PATH')) define('POSTED_IMAGES_PATH', IP_ROOT_PATH . 'files/images/');
  15. if (!defined('POSTED_IMAGES_THUMBS_PATH')) define('POSTED_IMAGES_THUMBS_PATH', IP_ROOT_PATH . 'files/thumbs/');
  16. if (!defined('POSTED_IMAGES_THUMBS_S_PATH')) define('POSTED_IMAGES_THUMBS_S_PATH', POSTED_IMAGES_THUMBS_PATH . 's/');
  17. if (!defined('FILE_UPLOAD_NOT_UPLOADED')) define('FILE_UPLOAD_NOT_UPLOADED', 0);
  18. if (!defined('FILE_UPLOAD_UPLOADED')) define('FILE_UPLOAD_UPLOADED', 1);
  19. if (!defined('FILE_UPLOAD_ERROR')) define('FILE_UPLOAD_ERROR', 2);
  20. if (!defined('FILE_UPLOAD_TOO_BIG')) define('FILE_UPLOAD_TOO_BIG', 3);
  21. if (!defined('FILE_UPLOAD_TYPE_ERROR')) define('FILE_UPLOAD_TYPE_ERROR', 4);
  22. /**
  23. * Files upload management class
  24. */
  25. class class_files_upload extends class_files
  26. {
  27. var $target_folder = '';
  28. var $thumbs_folder = '';
  29. /**
  30. * Class initialization
  31. */
  32. function __construct()
  33. {
  34. $this->target_folder = POSTED_IMAGES_PATH;
  35. $this->thumbs_folder = POSTED_IMAGES_THUMBS_PATH;
  36. }
  37. /*
  38. * Upload the file
  39. */
  40. function upload($should_be_image = false)
  41. {
  42. $return_array = array(
  43. 'result' => FILE_UPLOAD_NOT_UPLOADED,
  44. 'name' => '',
  45. 'full_path' => '',
  46. 'size' => 0,
  47. 'width' => 0,
  48. 'height' => 0,
  49. 'is_image' => false
  50. );
  51. $file_uploaded = false;
  52. $file_name = basename($_FILES[$file_var_name]['name']);
  53. $file_tmp_name = $_FILES[$file_var_name]['tmp_name'];
  54. $file_size = $_FILES[$file_var_name]['size'];
  55. $file_details = $this->get_file_details($file_name);
  56. if (!in_array($file_details['extension'], $this->allowed_extensions) || in_array($file_details['extension'], $this->disallowed_extensions))
  57. {
  58. $return_array['result'] = FILE_UPLOAD_TYPE_ERROR;
  59. return $return_array;
  60. }
  61. if($file_size < $this->max_size)
  62. {
  63. if (!@is_dir($this->temp_folder))
  64. {
  65. $this->create_temp_dir();
  66. }
  67. $temp_file_name = $this->generate_file_name($this->temp_folder, $file_name);
  68. $target_file_name = $this->generate_file_name($this->target_folder, $file_name);
  69. if(@is_uploaded_file($file_tmp_name))
  70. {
  71. if (@move_uploaded_file($file_tmp_name, $temp_file_name))
  72. {
  73. @chmod($temp_file_name, 0666);
  74. $uploaded_file_size = @filesize($temp_file_name);
  75. if(empty($uploaded_file_size) || ($uploaded_file_size > $this->max_size))
  76. {
  77. @unlink($temp_file_name);
  78. $this->cleanup($this->temp_folder);
  79. $return_array['result'] = FILE_UPLOAD_TOO_BIG;
  80. return $return_array;
  81. }
  82. $return_array['size'] = $uploaded_file_size;
  83. if ($should_be_image)
  84. {
  85. $image_size = @getimagesize($temp_file_name);
  86. if(empty($image_size))
  87. {
  88. @unlink($temp_file_name);
  89. $this->cleanup($this->temp_folder);
  90. $return_array['result'] = FILE_UPLOAD_TYPE_ERROR;
  91. return $return_array;
  92. }
  93. else
  94. {
  95. if (empty($image_size[0]) || ($image_size[0] > $this->max_width) || empty($image_size[1]) || ($image_size[1] > $this->max_height))
  96. {
  97. @unlink($temp_file_name);
  98. $this->cleanup($this->temp_folder);
  99. $return_array['result'] = FILE_UPLOAD_TOO_BIG;
  100. return $return_array;
  101. }
  102. $return_array['width'] = $image_size[0];
  103. $return_array['height'] = $image_size[1];
  104. $file_uploaded = true;
  105. }
  106. }
  107. else
  108. {
  109. $file_uploaded = true;
  110. }
  111. if ($file_uploaded)
  112. {
  113. $move_result = @rename($temp_file_name, $target_file_name);
  114. if (!empty($move_result))
  115. {
  116. @chmod($target_file_name, 0777);
  117. $return_array['result'] = FILE_UPLOAD_UPLOADED;
  118. $return_array['name'] = basename($target_file_name);
  119. $return_array['full_path'] = $target_file_name;
  120. return $return_array;
  121. }
  122. else
  123. {
  124. @unlink($temp_file_name);
  125. $this->cleanup($this->temp_folder);
  126. $return_array['result'] = FILE_UPLOAD_ERROR;
  127. return $return_array;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. else
  134. {
  135. $return_array['result'] = FILE_UPLOAD_TOO_BIG;
  136. return $return_array;
  137. }
  138. $return_array['result'] = FILE_UPLOAD_NOT_UPLOADED;
  139. return $return_array;
  140. }
  141. /*
  142. * Clean all upload garbage
  143. */
  144. function full_cleanup()
  145. {
  146. $files_to_skip = array_unique(array_merge((array) $this->files_to_skip, array('.htaccess', 'index.html')));
  147. /*
  148. // Mighty Gorgon: I need to implement everywhere this code
  149. // Remove only temporary folders oldest than 2 hours ago
  150. $this->uploads_folder = $this->remove_trailing_slashes($this->uploads_folder) . '/';
  151. $t = floor(time() / 3600);
  152. // Start removing from $hours_start ago (recent folders are preserved)
  153. $hours_start = 2;
  154. // How many hours should the script go back...
  155. $hours_back = 24 * 7;
  156. for($i = $hours_start; $i < $hours_back; $i++)
  157. {
  158. $num = $t - $i;
  159. if(@is_dir($this->uploads_folder . $num))
  160. {
  161. $this->cleanup($this->uploads_folder . $num, $files_to_skip, true, true, true);
  162. }
  163. }
  164. */
  165. $this->cleanup($this->uploads_folder, $files_to_skip, false, true, true);
  166. return true;
  167. }
  168. }
  169. ?>