|  [APORTE] Eliminar caracteres especiales, Subir varias img, Redimensionar img  
  Hace unos dias estuve haciendo unas funciones para para subir imagenes y redimensionarlas mediante php con la libreria GD. 
Son 3 funciones que aunque las utilizo de forma conjunta bien se podrian adaptar par utilizarlas por separado.  
Las dejo aquí por si a alguien le viene bien y si tienen mejoras o dudas, encantado de leerlas.  
La primera esta extraida de aquí 
eliminar_simbolos($string)   Código PHP:    <?php/**
 * Extraido de http://ecapy.com/reemplazar-la-n-acentos-espacios-y-caracteres-especiales-con-php-actualizada/
 * Reemplaza todos los acentos por sus equivalentes sin ellos
 *
 * @param $string
 *  string la cadena a sanear
 *
 * @return $string
 *  string saneada
 */
 function eliminar_simbolos($string){
 
 $string = trim($string);
 
 $string = str_replace(
 array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
 array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
 $string
 );
 
 $string = str_replace(
 array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
 array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
 $string
 );
 
 $string = str_replace(
 array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
 array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
 $string
 );
 
 $string = str_replace(
 array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
 array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
 $string
 );
 
 $string = str_replace(
 array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
 array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
 $string
 );
 
 $string = str_replace(
 array('ñ', 'Ñ', 'ç', 'Ç'),
 array('n', 'N', 'c', 'C',),
 $string
 );
 
 $string = str_replace(
 array("\\", "¨", "º", "-", "~",
 "#", "@", "|", "!", "\"",
 "·", "$", "%", "&", "/",
 "(", ")", "?", "'", "¡",
 "¿", "[", "^", "<code>", "]",
 "+", "}", "{", "¨", "´",
 ">", "< ", ";", ",", ":",
 ".", " "),
 '-',
 $string
 );
 return $string;
 }
 ?>
 redimiensionar_img()   Código PHP:    <?php/**
 *
 * XERIFANDTOMAS
 *
 * Redimensiona una image manteniendo las proporciones
 *
 * @param string $img ( OBILIGATORIO )
 *   ruta de la imagen
 *
 * @param string $nombre ( OBILIGATORIO )
 *   nombre para la imagen, extension incluida
 *
 * @param string $ruta ( OPCIONAL )
 *   Default: $_SERVER['DOCUMENT_ROOT']/img/ANCHOxALTO/
 *   ruta de la imagen final
 *
 * @param int $max_w ( OPCIONAL )
 *   Default: 200
 *   Ancho máximo de la imagen ( se mantienen proporciones )
 *
 * @param int $max_h ( OPCIONAL )
 *   Default: 200
 *   Alto máximo de la imagen final ( se mantienen proporciones )
 *
 * @param int $calidad ( OPCIONAL )
 *   Default: 90
 *   Calidad de la imagen, rango de 0 a 99
 *
 *
 *
 * @return TRUE / FALSE
 *  Devuelve TRUE en caso de exito y FALSE en caso de error
 */
 function redimiensionar_img($img,$nombre,$max_w=200,$max_h=200,$ruta="",$calidad=90){
 
 if ( !file_exists($img) ){ return false; }
 if ($ruta=="") { $ruta = $_SERVER['DOCUMENT_ROOT']."/img/".$max_w.'x'.$max_h.'/'; }
 if ( !file_exists($ruta) ) {
 if( !mkdir($ruta, 0775, true) ){ return false; }
 }
 if($calidad>99){ return false; }
 
 list($w,$h)=getimagesize($img);
 $nombre = explode('.', $nombre);
 
 $extension = end($nombre);
 switch ($extension) {
 case 'jpeg':
 $img_original = imagecreatefromjpeg($img);
 break;
 case 'jpg':
 $img_original = imagecreatefromjpeg($img);
 break;
 case 'png':
 $img_original = imagecreatefrompng($img);
 break;
 default:
 return false;
 break;
 }
 $x_ratio = $max_w / $w;
 $y_ratio = $max_h / $h;
 if( ($w <= $max_w) && ($h <= $max_h) ){ $w_final = $w; $h_final = $h; }
 elseif( ($x_ratio * $h) < $max_h ){ $w_final = $max_w; $h_final = ceil($x_ratio * $h); }
 else{ $w_final = ceil($y_ratio * $w); $h_final = $max_h; }
 
 $tmp=imagecreatetruecolor($w_final,$h_final);
 imagecopyresampled($tmp,$img_original,0,0,0,0,$w_final, $h_final,$w,$h);
 imagedestroy($img_original);
 
 switch ($extension) {
 case 'jpeg':
 $destino= $ruta.''.$nombre[0].'.jpeg';
 imagejpeg($tmp,$destino,$calidad);
 break;
 case 'jpg':
 $destino= $ruta.''.$nombre[0].'.jpg';
 imagejpeg($tmp,$destino,$calidad);
 break;
 case 'png':
 $calidad=floor($calidad/10);
 $destino= $ruta.''.$nombre[0].'.png';
 imagepng($tmp,$destino,$calidad);
 break;
 default:
 return false;
 break;
 }
 return true;
 }
 ?>
 upload_img()   Código PHP:    <?php/**
 *
 * XERIFANDTOMAS
 *
 *  Guarda una imagen en el servidor pasada
 *
 * @param array $file ( OBILIGATORIO )
 *   Debe de pasarse $_FILES habiendo subido los archivos en el form con name="myNombre[]"
 *
 * @param string $nombre ( OPCIONAL )
 *   Default: img
 *   nombre para la imagen,los caracteres extraños seran cambiados por eliminar_simbolos()
 *   Se añade marca de tiempo+identificador ( dmYHis-key )
 *   Ejemplo: MyImg-21022016154613-1.jpg
 *
 * @param string $ruta ( OPCIONAL )
 *   Default: $_SERVER['DOCUMENT_ROOT']/img/
 *   Ruta de la imagen final
 *
 * @param string $max_size ( OPCIONAL )
 *   Default: 5000000 (5MB)
 *   Tamaño máximo permitido de la imagen
 *
 * @param int $max_archivos ( OPCIONAL )
 *   Default: 5
 *   Número máximo de archivos que se pueden subir a la vez
 *
 *
 *
 * @return ARRAY / String
 *  En caso de éxito:  Devuelve un array con los nombres de las imagenes
 *  En caso de error:  Debuelve un string con el mensaje de error
 */
 function upload_img($file,$nombre="img",$ruta="",$max_size= "5000000",$max_archivos=5){
 $tipos_de_archivos= array("image/jpeg","image/jpg","image/png");
 
 if ($ruta=="") { $ruta = $_SERVER['DOCUMENT_ROOT']."/img/"; }
 if ( !file_exists($ruta) ) {
 if( !mkdir($ruta, 0775, true) ){ return false; }
 }
 
 $key_files=array_keys($file);
 $numero_de_archivos= count($file[$key_files[0]]['name']);
 if ($numero_de_archivos<1) {return 'No se ha cargado ningun archivo.';}
 if ($numero_de_archivos>$max_archivos) {return 'Solo se pueden subir <b>'.$max_archivos.' archivos</b> a la vez.';}
 if ( !is_array($file[$key_files[0]]['tmp_name']) ){return 'Se deben subir los archivos como un array.';}
 
 $tmp_name= $file[$key_files[0]]['tmp_name'];
 $type= $file[$key_files[0]]['type'];
 $size= $file[$key_files[0]]['size'];
 $name= $file[$key_files[0]]['name'];
 $error= $file[$key_files[0]]['error'];
 
 foreach ($tmp_name as $k => $v) {
 if (!is_uploaded_file($v)) {return '<br/>El archivo <b>'.$name[$k].'</b> ha dado error.';}
 }
 foreach ($error as $k => $v) {
 if ($v!==0) {return '<br/>El archivo <b>'.$name[$k].'</b> ha dado error.';}
 }
 foreach ($type as $k => $v) {
 if (!in_array($v, $tipos_de_archivos)){return '<br/>El archivo <b>'.$name[$k].'</b> no esta permitido. Solo archivos JPG, JPEG, PNG.';}
 }
 foreach ($size as $k => $v) {
 if ($v>$max_size) {return '<br/>El archivo <b>'.$name[$k].'</b> supera el tamaño permitido.';}
 }
 foreach ($name as $k => $v) {
 $extension = end(explode('.', $v));
 $nombre_final[$k]=eliminar_simbolos($nombre).'-'.date('dmYHis').'-'.$k.'.'.$extension;
 }
 foreach ($tmp_name as $k => $v) {
 if( redimiensionar_img($tmp_name[$k],$nombre_final[$k],200,200) ){}else{ return '<br/>Fallo redimensión.';}
 if( redimiensionar_img($tmp_name[$k],$nombre_final[$k],50,50) ){}else{ return '<br/>Fallo redimensión.';}
 }
 foreach ($tmp_name as $k => $v) {
 $destino= $ruta.$nombre_final[$k];
 if(!move_uploaded_file($v, $destino)){return '<br/>No se ha podido mover el archivo al servidor.';}
 $n[]=$nombre_final[$k];
 }
 return $n;
 }
 ?>
 Uso   Código PHP:    $archivos= upload_img($_FILES,$nombre); 
 Formulario html 
Es importante el uso de corchetes [ ] en   name="MyArchivo[]" 
Código HTML:
 Ver original<form action="myAction" method="post" enctype="multipart/form-data">    <input type="file" name="MyArchivo[]" multiple />    <input type="submit" value="Subir" />
  Última edición por xerifandtomas; 26/03/2016 a las 14:54
     |