Foros del Web » Programando para Internet » PHP »

caracteres %0d%0a en el nombre de un archivo

Estas en el tema de caracteres %0d%0a en el nombre de un archivo en el foro de PHP en Foros del Web. Buenas tardes, tengo un problema con un script que envía un enlace de un archivo por correo electrónico. El script lo que hace es coger ...
  #1 (permalink)  
Antiguo 10/11/2009, 12:07
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
caracteres %0d%0a en el nombre de un archivo

Buenas tardes, tengo un problema con un script que envía un enlace de un archivo por correo electrónico.

El script lo que hace es coger un archivo, cambiar el formato del nombre para eliminar caracteres especiales, subirlo al servidor y enviar un mail con el enlace, el problema es que en el enlace algunas veces aparecen los caracteres %0d%0a en el nombre del archivo, esto se interpreta como un intro en el navegador y el enlace falla.

Explico un poco el código que tengo:
Esta es la función que limpia los carateres especiales:

Código PHP:
function LimpiaEspacios($CadenaConMuchosEspacios)
{
$CadenaConMuchosEspaciosstrtolower($CadenaConMuchosEspacios); //pasa a minusculas

$CadenaConMuchosEspaciostrim($CadenaConMuchosEspacios); //eliminamos todos los espacios que estan antes y despues de la cadena

$CadenaReguladaereg_replace"[^a-z0-9_.]"""$CadenaConMuchosEspacios);
return 
$CadenaRegulada;

Código que sube el archivo:

Código PHP:
//recoge el contenido de los input file - una linea por cada archivo
$archivo $_FILES["archivo"]["name"];
$archivo_sin_espacios LimpiaEspacios($archivo);

//comprueba si se ha añadido archivo
if($archivo!=""){
//define ruta de destino
$destino 'archivos/'.$archivo_sin_espacios;

//sube el archivo al directorio /archivos
copy($_FILES["archivo"]["tmp_name"], $destino);

//variable para mostrar el nombre de los archivos adjuntos 
$adjuntos .= $archivo_sin_espacios;

}
else 
$destino=""
Código que muestra el enlace del archivo (esto es una parte de lo que se enviará por mail)

Código PHP:
if ($adjuntos!="") {
    
$_SESSION["foot"] .= "<br><b>Adjunto:</b> <a href='descarga.php?id=".$adjuntos."' target='_blank'><b>".$adjuntos."</b></a>";
    } 
Lo que me parece raro es que en el href aparezcan los caracteres %0d%0a y en el nombre no, cuando es la misma variable ($adjuntos) sin ninguna operación intermedia. Por ejemplo muestra el nombre archivoadjunto.doc pero al hacer clic busca el nombre archivoad%0d%0ajunto.doc y falla.

Agradecería cualquier sugerencia.
Muchas gracias. Saludos
  #2 (permalink)  
Antiguo 11/11/2009, 03:29
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: caracteres %0d%0a en el nombre de un archivo

Veo que los caracteres %0d%0a se corresponden con nueva linea y retorno de carro, he pensado en incluir otra nueva funcion que filtre de nuevo la cadena incluida en la variable que voy a poner en el href y que elimine todo lo que pueda dar lugar a un retorno de carro, sería algo así:

Código PHP:
function Limpia0d0a ($cadena){
$cadenastrtolower($cadena); //paso de nuevo a minusculas
$cadenaereg_replace" """$cadena); //tambien mete un espacio
$cadenaereg_replace"%20"""$cadena); //por si transforma el espacio 
$cadenaereg_replace"%0d%0a"""$cadena); //los navegadores interpretan %0d%0a como un retorno de carro
$cadenaereg_replace"%0d"""$cadena);
$cadenaereg_replace"%0a"""$cadena);
$cadenaereg_replace"<br/>"""$cadena);
$cadenaereg_replace"<br>"""$cadena);
$cadenaereg_replace"\n"""$cadena);
$cadenaereg_replace"\r"""$cadena);
$cadenaereg_replace"\x0d"""$cadena);
$cadenaereg_replace"\x0a"""$cadena);

return 
$cadena;

para luego mostrarlo así:

Código PHP:
if ($adjuntos!="") {
    
$_SESSION["foot"] .= "<br><b>Adjunto:</b> <a href='descarga.php?id=".Limpia0d0a($adjuntos)."' target='_blank'><b>".$adjuntos."</b></a>";
    } 
¿Tenéis una solución mejor?
Gracias
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 10:48.