Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/02/2016, 10:31
xerifandtomas
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
[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($ruta0775true) ){ 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($ruta0775true) ){ return false; }
    }

    
$key_files=array_keys($file);
    
$numero_de_archivoscount($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&ntilde;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&oacute;n.';}
        if( 
redimiensionar_img($tmp_name[$k],$nombre_final[$k],50,50) ){}else{ return '<br/>Fallo redimensi&oacute;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:
$archivosupload_img($_FILES,$nombre); 
Formulario html
Es importante el uso de corchetes [ ] en name="MyArchivo[]"
Código HTML:
Ver original
  1. <form action="myAction" method="post" enctype="multipart/form-data">
  2. <legend>Subir img</legend>
  3.     <input type="file" name="MyArchivo[]" multiple />
  4.     <input type="submit" value="Subir" />
  5. </form>

Última edición por xerifandtomas; 26/03/2016 a las 14:54