Foros del Web » Programando para Internet » PHP »

Reemplazar caracteres especiales en nombre de archivo

Estas en el tema de Reemplazar caracteres especiales en nombre de archivo en el foro de PHP en Foros del Web. Hola, que tal? Estoy haciendo un módulo de carga de archivos al servidor que después podrán ser descargados. Lo que quiero saber es si existe ...
  #1 (permalink)  
Antiguo 20/09/2010, 06:44
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Pregunta Reemplazar caracteres especiales en nombre de archivo

Hola, que tal? Estoy haciendo un módulo de carga de archivos al servidor que después podrán ser descargados. Lo que quiero saber es si existe alguna función para reemplazar todos los caracteres especiales que pueda tener el nombre del archivo para que esto después no genere conflicto.

Ya hice que se reemplacen todos los espacios por _ con:

Código PHP:
$tempFile str_replace(' ''_'$_FILES['Filedata']['tmp_name']); 
Pero quisiera también reemplazar acentos (por ejemplo: á por a, é por e, ü por u, etc.) y cualquier otro caracter que pueda ser conflictivo luego.

Existe alguna función predeterminada para esta tarea?

Muchas gracias. Saludos.
__________________
Facundo
http://www.creactivo.com.ar
  #2 (permalink)  
Antiguo 20/09/2010, 08:16
Avatar de Kamae  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona (Catalunya)
Mensajes: 307
Antigüedad: 16 años
Puntos: 13
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Buenas

Googleando he encontrado esto, lo he probado y funciona:

Código PHP:
function sinAcentos($cadena){
   
$tofind "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ· ";
   
$replac "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn-_";
   return(
strtr($cadena,$tofind,$replac));
}

echo 
sinAcentos("Macarrón, Park Güell, Plaça España, Pel·licula, Àlgún tòntö qüé íntèntë jÓdÉrtë côn Êstõ"); // Comprobación 
EDITO: He añadido que sustituya también los espacios por barrabajas ( _ ) y los "middot" ( · ) por guión ( - ). Supongo que has entendido el mecanismo de las 2 variables así que puedes añadir todo lo que quieras. Podrías usar también la función strtolower y te ahorrarías mirarlo con mayúsculas

Espero que te sirva, saludos

Última edición por Kamae; 20/09/2010 a las 08:22 Razón: Añadir información
  #3 (permalink)  
Antiguo 20/09/2010, 08:46
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Kamae, muchas gracias por el código. Pero me da cierto problema.

Envío la cadena (nombre de archivo) siguiente:

"estóy probándo un nómbre de archívo con acéntos DOS.txt"

Y al formatearla queda así:

"est_iy prob_Ondo un n_imbre de arch_­vo con ac_©ntos DOS.txt"

Qué puede ser lo que está pasando?

Gracias nuevamente. ;)
__________________
Facundo
http://www.creactivo.com.ar
  #4 (permalink)  
Antiguo 20/09/2010, 08:50
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Ahora probé también utilizando el código exactamente como lo enviaste, y ocurre lo siguiente:



Código
Código PHP:
<?php 

function sinAcentos($cadena){
   
$tofind "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ· ";
   
$replac "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn-_";
   return(
strtr($cadena,$tofind,$replac));
}

echo 
sinAcentos("Macarrón, Park Güell, Plaça España, Pel·licula, Àlgún tòntö qüé íntèntë jÓdÉrtë côn Êstõ"); // Comprobación 

?>

Respuesta:

Macarr_in, Park G_¼ell, Pla_§a Espa_±a, Pel·licula, _Alg_ºn t_Int_U q_¼_© _ nt_¨nt_« j_Ed_Nrt_« c_in _-st_U
__________________
Facundo
http://www.creactivo.com.ar
  #5 (permalink)  
Antiguo 20/09/2010, 09:08
Avatar de Kamae  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona (Catalunya)
Mensajes: 307
Antigüedad: 16 años
Puntos: 13
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Mmmm supongo que es algo de la codificación, no debemos usar la misma porque a mí me devuelve bien Macarron,_Park_Guell,_Placa_Espana,_Pel-licula_Algun_tonto_que_intente_jOdErte_con_Esto

Qué programa usas para programar? Yo uso Notepad++ y si por ejemplo me voy a Formato se lo cambio a ANSI, luego en cada página tengo un:

Código PHP:
<head>
   <
title>(...)</title>
   <
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   (...)
</
head
Siento no saber decirte nada más, pero que es de codificación de caracteres seguro.
Intenta probarlo o a ver si viene alguien que pueda ayudarte más.

Saludos
  #6 (permalink)  
Antiguo 20/09/2010, 09:14
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Respuesta: Reemplazar caracteres especiales en nombre de archivo

La verdad es que no entiendo eso de la codificación, pero esta función no la quiero para mostrar texto en pantalla, sino para cambiar el nombre de un archivo al subirlo al servidor.

Cómo debería darle la codificación para que funcione bien? Te copio el código que tengo actualmente. Uso Dreamweaver CS5.

Código PHP:
<?php
function formatearNombre($cadena){
   
$tofind "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ· ";
   
$replac "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn-_";
   return(
strtr($cadena,$tofind,$replac));
}
require_once(
'../classes/documentos.class.php');

if(isset(
$_GET['action'])){
    switch(
$_GET['action']){
        case 
'nuevo':
            if (!empty(
$_FILES)) {
                
$titulo htmlspecialchars(trim($_POST['titulo']));
                
$descripcion htmlspecialchars(trim($_POST['descripcion']));
                
$keywords htmlspecialchars(trim($_POST['keywords']));
                
$idInstitucion htmlspecialchars(trim($_POST['idInstitucion']));
                
$idCarrera htmlspecialchars(trim($_POST['idCarrera']));
                
$idMateria htmlspecialchars(trim($_POST['idMateria']));
                
$idProfesor htmlspecialchars(trim($_POST['idProfesor']));
                
$tempFile $_FILES['Filedata']['tmp_name'];
                
$idUnico date('Ymd');
                
$idUnico .= $idInstitucion;
                
$idUnico .= $idCarrera;
                
$idUnico .= $idMateria;
                
$idUnico .= $idProfesor;
                
$idUnico .= '_';
                
$size $_FILES['Filedata']['size'];
                
$fileName $idUnico $_FILES['Filedata']['name'];
                
$fileName formatearNombre($fileName);
                
                
$targetPath $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
                
$targetFile =  str_replace('//','/',$targetPath) . $fileName;
                
                if(
move_uploaded_file($tempFile,$targetFile)){
                    
$objDocumento = new Documentos;
                    if (
$objDocumento->nuevoDocumento(array($idInstitucion$idCarrera$idMateria$idProfesor$titulo$descripcion$keywords$fileName$size)) == true){
                        echo 
'ok';
                    }else{
                        echo 
'error';
                    }
                } else {
                    echo 
'error';
                }
            }
            break;
            
        
//Aca van otros CASE
    
}
}
?>

No lo uso en un documento que se decodifique en HTML, sino un PHP que procesa las solicitudes y devuelve ok o error.
__________________
Facundo
http://www.creactivo.com.ar
  #7 (permalink)  
Antiguo 20/09/2010, 09:59
Avatar de Kamae  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona (Catalunya)
Mensajes: 307
Antigüedad: 16 años
Puntos: 13
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Buenas de nuevo

¿Has probado a ejecutarlo a ver cómo te guarda el nombre del fichero? Quizás al no pintarlo por HTML la codificación no afecta y le quita bien los acentos al fichero.

De no ser así, si lo sigue pintando mal, yo el Dreamweaver no lo uso, pero googleando pone que si vas a Modificar -> Propiedades de la página -> Título/Codificación -> Codificación puedes cambiársela al archivo en concreto. (OJO: Haz una copia antes de todos tus ficheros, con los cambios de codificación ya que puede ser que te elimine los caracteres con acento o los cambie por símbolos raros cómo te ocurre al mostrar la función que yo puse, y puede ser irreversible)

Teóricamente si lo cambias a ANSI y arreglas las tildes que se hayan jodido por símbolos (con un Buscar/Reemplazar mismo lo tienes hecho en un par de minutos) debería solucionarte el problema.
  #8 (permalink)  
Antiguo 20/09/2010, 10:10
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Si, lo probé y anteriormente y me lo guarda como te dije en la otra respuesta:


Envío la cadena (nombre de archivo) siguiente:

estóy probándo un nómbre de archívo con acéntos DOS.txt

Y al formatearla queda así:

est_iy prob_Ondo un n_imbre de arch_ vo con ac_©ntos DOS.txt

:S
__________________
Facundo
http://www.creactivo.com.ar
  #9 (permalink)  
Antiguo 20/09/2010, 10:22
Avatar de fakulicious  
Fecha de Ingreso: mayo-2008
Ubicación: Mendoza
Mensajes: 140
Antigüedad: 16 años
Puntos: 2
Respuesta: Reemplazar caracteres especiales en nombre de archivo

Ahora si funciona!! =D Encontré algo en el Manual de la función strtr() de PHP y mi código quedó así:

Código PHP:

function formatearNombre($cadena){
    
$tofind "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ· ";
    
$replac "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn-_";
    
$cadena utf8_decode($cadena);     
    
$cadena strtr($cadenautf8_decode($tofind), $replac); 
    
$cadena strtolower($cadena); 
    return 
utf8_encode($cadena);
    


Muchísimas gracias Kamae!! no hubiese llegado a nada sin tu ayuda!! ;)
__________________
Facundo
http://www.creactivo.com.ar
  #10 (permalink)  
Antiguo 21/09/2010, 09:27
Avatar de Kamae  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona (Catalunya)
Mensajes: 307
Antigüedad: 16 años
Puntos: 13
Respuesta: Reemplazar caracteres especiales en nombre de archivo

No hay de qué! Me alegro de que lo hayas solucionado! Además ahora también sé convertir caracteres a diferente codificación con strtr jejej :P

Etiquetas: caracteres, especiales, nombre, reemplazar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:01.