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

/application/libraries/superupload.php

https://github.com/mydesignivan/guerraguerrero
PHP | 267 lines | 200 code | 55 blank | 12 comment | 32 complexity | 5816038deb6448183d91d891432f33a7 MD5 | raw file
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. class SuperUpload{
  3. /* CONSTRUCTOR
  4. **************************************************************************/
  5. function __construct($params=null) {
  6. $this->CI =& get_instance();
  7. $this->CI->load->helper('form');
  8. $this->CI->load->library('image_lib');
  9. require_once(APPPATH.'config/mimes'.EXT);
  10. if( is_array($params) ) $this->initialize($params);
  11. $this->_output = $this->_error = array();
  12. $this->_mimes = $mimes;
  13. }
  14. /* PRIVATE PROPERTIES
  15. **************************************************************************/
  16. private $CI;
  17. private $_params;
  18. private $_output;
  19. private $_file;
  20. private $_mimes;
  21. private $_error;
  22. /* PUBLIC FUNCTIONS
  23. **************************************************************************/
  24. public function initialize($params){
  25. $this->_params = array(
  26. 'path' => $params['path'], //Obligatorio
  27. 'watermark' => isset($params['watermark']) ? $params['watermark'] : false,
  28. 'watermark_options' => array(
  29. 'type' => !isset($params['watermark_options']['type']) ? 'overlay' : $params['watermark_options']['type'],
  30. 'vrt_alignment' => !isset($params['watermark_options']['vrt_alignment']) ? 'bottom' : $params['watermark_options']['vrt_alignment'],
  31. 'hor_alignment' => !isset($params['watermark_options']['hor_alignment']) ? 'right' : $params['watermark_options']['hor_alignment'],
  32. 'opacity' => !isset($params['watermark_options']['opacity']) ? '30' : $params['watermark_options']['opacity'],
  33. 'overlay_path' => !isset($params['watermark_options']['overlay_path']) ? '' : $params['watermark_options']['overlay_path'],
  34. ),
  35. 'resize_image_original' => isset($params['resize_image_original']) ? $params['resize_image_original'] : true,
  36. 'thumb_width' => $params['thumb_width'], //Obligatorio
  37. 'thumb_height' => $params['thumb_height'], //Obligatorio
  38. 'image_width' => @$params['image_width'], //Obligatorio
  39. 'image_height' => @$params['image_height'], //Obligatorio
  40. 'master_dim' => !isset($params['master_dim']) ? 'auto' : $params['master_dim'], // auto, width, height
  41. 'maxsize' => !isset($params['maxsize']) ? 2048 : $params['maxsize'],
  42. 'filetype' => !isset($params['filetype']) ? 'gif|jpg|png' : $params['filetype'],
  43. 'error_uploaded' => !isset($params['error_uploaded']) ? 'El archivo no ha podido llegar al servidor' : $params['error_uploaded'],
  44. 'error_maxsize' => !isset($params['error_maxsize']) ? 'El tamaño del archivo debe ser menor a {size} MB.' : $params['error_maxsize'],
  45. 'error_filetype' => !isset($params['error_filetype']) ? 'El tipo de archivo es incompatible.' : $params['error_filetype'],
  46. 'filename_prefix' => !isset($params['filename_prefix']) ? '' : $params['filename_prefix']
  47. );
  48. }
  49. public function upload($name){
  50. if( $_SERVER['REQUEST_METHOD']!="POST" || !isset($_FILES[$name]) ) return false;
  51. $this->_file = $_FILES[$name];
  52. if( !is_array($this->_file['name']) ){
  53. $this->_file['name'] = array($this->_file['name']);
  54. $this->_file['type'] = array($this->_file['type']);
  55. $this->_file['tmp_name'] = array($this->_file['tmp_name']);
  56. $this->_file['error'] = array($this->_file['error']);
  57. $this->_file['size'] = array($this->_file['size']);
  58. }
  59. for( $n=0; $n<=count($this->_file['name'])-1; $n++ ){
  60. if( empty($this->_file['tmp_name'][$n]) ) continue;
  61. $output = array();
  62. $resultValid = $this->_validate($n);
  63. if( $resultValid===true ){
  64. $filename = $this->_get_filename($this->_file['name'][$n]);
  65. $ext = substr($filename, (strripos($filename, ".")-strlen($filename))+1);
  66. $basename = substr($filename, 0, strripos($filename, "."));
  67. $filename_thumb = $basename . "_thumb." . $ext;
  68. $output['href_image_full'] = $this->_params['path'] . $filename;
  69. $output['href_image_thumb'] = $this->_params['path'] . $filename_thumb;
  70. $output['path'] = $this->_params['path'];
  71. $output['filename_image'] = $filename;
  72. $output['filename_thumb'] = $filename_thumb;
  73. // Muevo la imagen original
  74. move_uploaded_file($this->_file['tmp_name'][$n], $this->_params['path'] . $filename);
  75. chmod($this->_params['path'] . $filename, 0777);
  76. // Crea una marca de agua en la imagen
  77. if( $this->_params['watermark'] ){
  78. $config = array();
  79. $config['source_image'] = $this->_params['path'] . $filename;
  80. $config['wm_type'] = $this->_params['watermark_options']['type'];
  81. $config['wm_overlay_path'] = $this->_params['watermark_options']['overlay_path'];
  82. $config['wm_vrt_alignment'] = $this->_params['watermark_options']['vrt_alignment'];
  83. $config['wm_hor_alignment'] = $this->_params['watermark_options']['hor_alignment'];
  84. $config['wm_opacity'] = $this->_params['watermark_options']['opacity'];
  85. $this->CI->image_lib->initialize($config);
  86. if( !$this->CI->image_lib->watermark() ) $this->_show_error($this->CI->image_lib->display_errors());
  87. }
  88. $sizes_image_original = getimagesize($this->_params['path'] . $filename);
  89. if( $sizes_image_original[0] > $this->_params['thumb_width'] || $sizes_image_original[1] > $this->_params['thumb_height'] ){
  90. // Crea una copia y dimensiona la imagen (THUMB)
  91. $config = array();
  92. $config['source_image'] = $this->_params['path'] . $filename;
  93. if( $this->_params['resize_image_original'] ) $config['new_image'] = $this->_params['path'] . $filename_thumb;
  94. $config['width'] = $this->_params['thumb_width'];
  95. $config['height'] = $this->_params['thumb_height'];
  96. $config['master_dim'] = $this->_params['master_dim'];
  97. $this->CI->image_lib->clear();
  98. $this->CI->image_lib->initialize($config);
  99. if( $this->CI->image_lib->resize() ) {
  100. $fn = $this->_params['resize_image_original'] ? $filename_thumb : $filename;
  101. $sizes_image_thumb = getimagesize($this->_params['path'] . $fn);
  102. $output['thumb_width'] = $sizes_image_thumb[0];
  103. $output['thumb_height'] = $sizes_image_thumb[1];
  104. // Dimensiona la imagen original (ORIGINAL)
  105. if( $this->_params['resize_image_original'] ){
  106. if( $sizes_image_original[0] > $this->_params['image_width'] || $sizes_image_original[1] > $this->_params['image_height'] ){
  107. $config = array();
  108. $config['source_image'] = $this->_params['path'] . $filename;
  109. if( $sizes_image_original[0] > $this->_params['image_width'] ) $config['width'] = $this->_params['image_width'];
  110. if( $sizes_image_original[1] > $this->_params['image_height'] ) $config['height'] = $this->_params['image_height'];
  111. $config['master_dim'] = $this->_params['master_dim'];
  112. $this->CI->image_lib->clear();
  113. $this->CI->image_lib->initialize($config);
  114. if( !$this->CI->image_lib->resize() ) $this->_save_error($this->CI->image_lib->display_errors(), $n);
  115. }
  116. }
  117. }else $this->_save_error($this->CI->image_lib->display_errors(), $n);
  118. }else{
  119. $output['thumb_width'] = $sizes_image_original[0];
  120. $output['thumb_height'] = $sizes_image_original[1];
  121. copy($this->_params['path'].$filename, $this->_params['path'].$filename_thumb);
  122. }
  123. }else $this->_save_error($resultValid, $n);
  124. $this->_output[] = $output;
  125. }//end for
  126. $ret['status'] = count($this->_error)>0 || count($this->_output)==0 ? "error" : "success";
  127. if( count($this->_output)==0 ){
  128. $this->_save_error('El servidor no ha resivido ningun archivo.', 0);
  129. }
  130. if( count($this->_error)>0 ) $ret['error'] = $this->_error;
  131. $ret['output'] = $this->_output;
  132. return $ret;
  133. }
  134. public function clear(){
  135. $this->_output = $this->_error = array();
  136. }
  137. public function get_error($errors){
  138. if( !isset($errors) || !is_array($errors) ) return false;
  139. $output = "<ul>";
  140. foreach( $errors as $error ){
  141. $txt = "Nombre de Archivo: " . $error['file']['name'] ."<br />";
  142. $txt.= "Mensaje: " . $error['message'];
  143. $output.= "<li>". $txt ."</li>";
  144. }
  145. $output.="</ul>";
  146. return $output;
  147. }
  148. /* PRIVATE FUNCTIONS
  149. **************************************************************************/
  150. private function _validate($n){
  151. if( !is_uploaded_file($this->_file['tmp_name'][$n]) ) return $this->_params['error_uploaded'];
  152. $size = (int)$this->_params['maxsize'];
  153. if( round($this->_file['size'][$n] / 1024, 2) > $size ) {
  154. return str_replace("{size}", (string)($size/1024), $this->_params['error_maxsize']);
  155. }
  156. if( !$this->_is_allowed_filetype($this->_file['type'][$n]) ) return $this->_params['error_filetype'];
  157. return true;
  158. }
  159. private function _is_allowed_filetype($type){
  160. $extention = explode("|", $this->_params['filetype']);
  161. foreach( $extention as $ext ){
  162. $mime = $this->_mimes[$ext];
  163. if( is_array($mime) ){
  164. if( in_array($type, $mime) ) return true;
  165. }else{
  166. if( $mime==$type ) return true;
  167. }
  168. }
  169. return false;
  170. }
  171. private function _get_filename($text){
  172. $separator = "_";
  173. $isUTF8 = (mb_detect_encoding($text." ",'UTF-8,ISO-8859-1') == 'UTF-8');
  174. $text = ($isUTF8) ? utf8_decode($text) : $text;
  175. $text = trim($text);
  176. $_a = utf8_decode("ÁÀãâàá");
  177. $_e = utf8_decode("ÉÈéè");
  178. $_i = utf8_decode("ÍÌíì");
  179. $_o = utf8_decode("ÓÒóò");
  180. $_u = utf8_decode("ÚÙúù");
  181. $_n = utf8_decode("Ññ");
  182. $_c = utf8_decode("Çç");
  183. $_b = utf8_decode("ß");
  184. $_dash = "\,_ ";
  185. $text = preg_replace("/[$_a]/", "a", $text );
  186. $text = preg_replace("/[$_e]/", "e", $text );
  187. $text = preg_replace("/[$_i]/", "i", $text );
  188. $text = preg_replace("/[$_o]/", "o", $text );
  189. $text = preg_replace("/[$_u]/", "u", $text );
  190. $text = preg_replace("/[$_n]/", "n", $text );
  191. $text = preg_replace("/[$_c]/", "c", $text );
  192. $text = preg_replace("/[$_b]/", "ss", $text );
  193. $text = preg_replace("/[$_dash]/", $separator, $text );
  194. $text = preg_replace("/[^a-zA-Z0-9\-]!=./", "", $text );
  195. $text = strtolower($text);
  196. $text = ($isUTF8) ? utf8_encode($text) : $text;
  197. return $this->_params['filename_prefix'].uniqid(time()) ."__". $text;
  198. }
  199. private function _save_error($msg, $n){
  200. $this->_error[] = array(
  201. 'message' => $msg,
  202. 'file' => array(
  203. 'name' => $this->_file['name'][$n],
  204. 'type' => $this->_file['type'][$n],
  205. 'tmp_name' => $this->_file['tmp_name'][$n],
  206. 'error' => $this->_file['error'][$n],
  207. 'size' => $this->_file['size'][$n]
  208. )
  209. );
  210. }
  211. }
  212. ?>