Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error al cargar archivos en PHP

Estas en el tema de Error al cargar archivos en PHP en el foro de PHP en Foros del Web. Hola amigos. Tengo un proyecto terminado pero hay un pequeño fallo que no se cómo solucionar y quisiera perdir vuestro consejo. El tema es que ...
  #1 (permalink)  
Antiguo 12/01/2014, 11:34
 
Fecha de Ingreso: enero-2010
Mensajes: 76
Antigüedad: 14 años, 3 meses
Puntos: 1
Error al cargar archivos en PHP

Hola amigos.

Tengo un proyecto terminado pero hay un pequeño fallo que no se cómo solucionar y quisiera perdir vuestro consejo.

El tema es que al leer un archivo de un directorio cuando el título del archivo lleva un espacio intermedio, el link me aparece cortado.

Por ejemplo si cargo este archivo Factura-MOVISTAR.PDF aparese sin errores como el siguiente ejemplo:

Código HTML:
http://dominio.com/2014/Facturas/Emitidas/Marzo/MOVISTAR-%2801-01-2014%29.PDF
Sin embargo cuando el nombre del archivo tiene un espacio intermedio como Factura MOVISTAR.PDF, el link se genera incompleto como el siguiente ejemplo:
Código HTML:
http://dominio.com/2014/Facturas/Emitidas/Marzo/MOVISTAR
generando un error 404

Un dato curioso es que estoy usando la misma variable $file también para borrar y este si que lo reconoce completo.

El código que estoy usando es el siguiente:

Código PHP:

<?php
    
// Ruta
    
$path "Facturas/Emitidas/Enero";
    
// Abrir la carpeta
    
$dir_handle = @opendir($path);
    
// Leer los archivos
    
while ($file readdir($dir_handle)) {
        
        
$data[] = array($filedate("Y-m-d H:i:s",filemtime($path.'/'.$file)));
        
$files[] = $file;
        
$dates[] = date("Y-m-d H:i:s",filemtime($path.'/'.$file));
    
array_multisort($datesSORT_DESC$data);    
    if(
$file == "." || $file == ".." || $file == "index.php" )
        continue;
        echo 
'<a href='.$path.'/'.$file.' target="_blank">Ver</a> / ';
        
$borrar 'Facturas/Emitidas/Enero/';
        
        echo 
'<a href="borrar.php?ruta='.$borrar.'&archivo='.$file.'" onclick="return confirmar('¿Está seguro de borrar este archivo?')">Borrar</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$file.'<br>';
    }
    
// Cerrar
    
closedir($dir_handle);
    
    
?>
Por más vueltas que le doy no encuentro el fallo y me interesa mucho poder solucionarlo ya que no me gustaría tener que estar cambiando los nombres a todos los archivos con caracteres especiales o espacios.

¿Alguien sabría por qué pasa esto y cómo solucionarlo?

Desde ya muy agradecido.
  #2 (permalink)  
Antiguo 12/01/2014, 13:31
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: Error al cargar archivos en PHP

Código PHP:
Ver original
  1. $cadena = str_replace(" ", "%20", $file);
  2. echo '<a href=' . $path . '/' . $cadena . ' target="_blank">Ver</a> / ';

Aquí creo, no estoy seguro, deberías escapar caracteres: (\'txt\') escapar
Código PHP:
Ver original
  1. echo '<a href="borrar.php?ruta=' . $borrar . '&archivo=' . $file . '" onclick="return confirmar(\'¿Está seguro de borrar este archivo?\')">Borrar</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' . $file . '<br>';
  #3 (permalink)  
Antiguo 13/01/2014, 06:29
 
Fecha de Ingreso: enero-2010
Mensajes: 76
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Error al cargar archivos en PHP

Madre mia que tontería, como no haber caido en reemplazar el espacio por el equivalente compatible %20, ya lo he cambiado Y FUNCIONA PERFECTO.

Sin embargo el link de borrar me va genial y sin errores ¿crees que hay algo incorrecto?, de todos modos no comprendo bien cual sería la modificación que debería hacer referente a escapar texto, agradecería una aclaración...

Pero con el código que necesitaba has acertado de lleno.
Muchas gracias bathorz por tu gran ayuda.
  #4 (permalink)  
Antiguo 13/01/2014, 09:16
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: Error al cargar archivos en PHP

El editor tira error de sintaxis en ('¿Está seguro de borrar este archivo?'). No le agrada el entramado de comillas, escapándolas ya no da niguna advertencia. Pero si funciona... pues ya está.
  #5 (permalink)  
Antiguo 13/01/2014, 11:41
 
Fecha de Ingreso: enero-2010
Mensajes: 76
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Error al cargar archivos en PHP

Ah, ahora te entiendo, en realidad el código está puesto de la siguiente manera (lo pego con los caracteres por separado para que se mantenga sin alteraciones):
Código PHP:
... confirmar[B]( & # 3 9 ; ¿Está seguro de borrar este archivo? & # 3 9 ; )[/B]">Borrar</a> ... 
en ningún momento lleva comillas a no ser las que delimitan el texto del <?php echo ... ?>

Muchas gracias por la aclaración.

De momento no voy a cerrar este tema porque estoy probando otra cosa basándome en tu sugerencia, en cuanto tenga resultados lo comento (por si a alguien le sirve)

Saludos.
  #6 (permalink)  
Antiguo 16/01/2014, 03:42
 
Fecha de Ingreso: enero-2010
Mensajes: 76
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Error al cargar archivos en PHP

Ante todo perdon por el retraso.

Al final he decidido usar una función para sanear más caracteres inválidos pero después de tanta lucha me sigue dando error, el código que estoy tratando de utilizar es el siguiente:

Código PHP:
<?php
function reemplazar_caracteres($file) {
        
$cadena mb_convert_encoding($cadena'UTF-8','');
        
$cadena preg_replace("/á|à|â|ã|ª/","a",$cadena);
        
$cadena preg_replace("/Á|À|Â|Ã/","A",$cadena);
        
$cadena preg_replace("/é|è|ê/","e",$cadena);
        
$cadena preg_replace("/É|È|Ê/","E",$cadena);
        
$cadena preg_replace("/í|ì|î/","i",$cadena);
        
$cadena preg_replace("/Í|Ì|Î/","I",$cadena);
        
$cadena preg_replace("/ó|ò|ô|õ|º/","o",$cadena);
        
$cadena preg_replace("/Ó|Ò|Ô|Õ/","O",$cadena);
        
$cadena preg_replace("/ú|ù|û/","u",$cadena);
        
$cadena preg_replace("/Ú|Ù|Û/","U",$cadena);
        
$cadena str_replace(" ","%20",$cadena);
        
$cadena str_replace("ñ","n",$cadena);
        
$cadena str_replace("Ñ","N",$cadena);
        
        
$cadena preg_replace('/[^a-zA-Z0-9_\.-]/'''$cadena);
        
return 
$cadena;

?>
Después para llamar a esta función tengo este código (desde la misma página)

Código PHP:

 <?php
     
// ruta
    
$path "Facturas/Recibidas/Enero";
    
// Abrir la carpeta
    
$dir_handle = @opendir($path);
    
// Leer los archivos
    
while ($file readdir($dir_handle)) {
        
        
$data[] = array($filedate("Y-m-d H:i:s",filemtime($path.'/'.$file)));
        
$files[] = $file;
        
$dates[] = date("Y-m-d H:i:s",filemtime($path.'/'.$file));
    
array_multisort($datesSORT_DESC$data);    
    if(
$file == "." || $file == ".." || $file == "Gestoria.php" )
        continue;
        
// $cadena = str_replace(" ", "%20", $file);
        
echo reemplazar_caracteres($file);
        echo 
'<a href='.$path.'/'.$cadena.' target="_blank">Ver</a> / ';
    }
    
// Cerrar
    
closedir($dir_handle);
    
    
?>
y cuando encuentra un archivo con caracteres raros y le doy a ver, me salta un 404 o si le doy a borrar me salta un error en el código de borrar en las líneas 5 y 6.

Código PHP:

1- <?php
2
$ruta $_GET['ruta'];
3$archivo $_GET['archivo'];
4$completo $ruta.$archivo;
5unlink($completo);
6header('Location: index.php');
?>
A veces me pregunto si no sería mejor escanear el nombre del archivo antes de subirlo y enviar una advertencia al usuario que modifique el nombre del mismo para evitar conflictos, no se es una idea, de todos modos estos archivos se pueden subir sólo por medio de este sistema (o por ftp) ¿qué opináis?.
  #7 (permalink)  
Antiguo 18/01/2014, 05:22
 
Fecha de Ingreso: enero-2010
Mensajes: 76
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Error al cargar archivos en PHP

Bueno después de dar tanta guerra con este tema, he decidido dejar lo más sencillo, efectivo y que funciona sin ningún problema.

El código que estoy utilizando ha sido lo que me aconsejó bathorz al principio de este tema, sustituir el espacio con %20 y todo funciona a la perfección.

La modificación que he realizado es una llamada de advertencia al usuario que subirá los archivos, informándole de los caracteres que debe evitar al nombrar los mismos para evitar conflictos en su lectura y administración.

Mi agradecimiento a bathorz por su gran ayuda y doy este tema por zanjado.

Saludos y mucha suerte a todos.

Etiquetas: variable
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:17.