Foros del Web » Programando para Internet » PHP »

problema con move_uploaded_file

Estas en el tema de problema con move_uploaded_file en el foro de PHP en Foros del Web. tengo un script que sube archivos y almacena el nombre del mismo en la base de datos.. funciona re bien pero cuando cargan archivos con ...
  #1 (permalink)  
Antiguo 03/02/2007, 20:18
Avatar de giotari
Usuario no validado
 
Fecha de Ingreso: mayo-2003
Ubicación: Chile
Mensajes: 295
Antigüedad: 21 años, 5 meses
Puntos: 0
Pregunta problema con move_uploaded_file

tengo un script que sube archivos y almacena el nombre del mismo en la base de datos.. funciona re bien pero cuando cargan archivos con espacios y puntos .. el move_uploaded_file los cambia por _ pero el archivo que nombre del archivo que guardo a la base de datos queda con el nombre original del archivo...

Código PHP:
$extension explode(".",$_FILES['zip']['name']); //extrae extension        
$tipo         $extension[1]."/"
$archivo   "../../".$Gd_config_archivos.$tipo.$_FILES['zip']['name']);
$Gd_detarchivos_archivo $_FILES['zip']['name'];
move_uploaded_file ($_FILES['zip']['tmp_name'],$archivo); 
$Gd_detarchivos_peso    calcula_peso($archivo); 
  #2 (permalink)  
Antiguo 03/02/2007, 23:56
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: problema con move_uploaded_file

Por lo que veo tenés varios problemas, a saber:

estás asumiendo que el nombre del archivo es de la forma

nombre.extensión

Y eso está MAL. Nunca podés asumir eso.

Mejor sería, hacer algo como esto:

$tipo = $extension[count($extension) - 1];

para asegurarte de que estás obteniendo la última parte.

Por otra parte, no creo que move_uploaded_file cambie el nombre por sí mismo... de todas formas lo podés arreglar sustituyendo antes los espacios:

str_replace(' ', '_', $nombre_archivo);

(que sustituye los espacios por _). Haciéndolo antes de procesar, te asegurás de que los datos coincidan.

Otro detalle: veo que usás una función para calcular el tamaño del archivo, dejame decirte que ese dato lo tenés en $_FILES['zip']['size'], aunque no me hagas mucho caso si tenés tus razones para hacerlo así


saludos.
  #3 (permalink)  
Antiguo 04/02/2007, 09:17
Avatar de giotari
Usuario no validado
 
Fecha de Ingreso: mayo-2003
Ubicación: Chile
Mensajes: 295
Antigüedad: 21 años, 5 meses
Puntos: 0
Re: problema con move_uploaded_file

mmm.. me quedo clarito.. PERO.. cuando es un archivo de nombre "maunal de usuario.enlinea.pdf" como saco los puntos ... ?... tendria quewsaacr la extencion y luego usar str_replace en el nombre del archivo... lo extraño (no se si tanto) es que el $_FILES['zip']['tmp_name'] ya vienen con el remplazo de espacios y puntos por _
  #4 (permalink)  
Antiguo 04/02/2007, 10:23
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 20 años
Puntos: 34
Re: problema con move_uploaded_file

Buenas giotari, para la extensión lo mejor es usar (por velocidad y seguridad):
Código PHP:
$extension strtolowerstrrchr($_FILES['zip']['name'], '. ') ); 
Con el tema del nombre, no te recomiendo que no uses el nombre original, ya que puede traerte problemas (como pisar un file existente).

Personalmente renombro el archivo poniéndole el id del registro de la db, así jamas se pisará con otro, quedándote algo así:
Código PHP:
...
$archivo   "../../"$Gd_config_archivos $tipo$idDb"_file" $extension ;
... 
Como obtenes el id? insertas si pasa las validaciones, obtenes el id, y luego de subirlo haces un update.
Si queres dejarle el nombre como referencia para el usuario que usa el sistema, hacelo, pero guardando en otro campo de la tabla.


PD: en la linea que esta $archivo hay al final un ) de más.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 04/02/2007, 10:31
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 19 años, 3 meses
Puntos: 6
Re: problema con move_uploaded_file

Para limpiar el nombre, creo que este es un buen ejemplo aunque se le pueden agregar cosas al filtro:

Código PHP:
<?php

function filtro($nombre)
{
    
//Reemplazamos los . y espacios en blanco por _
    
$nombre str_replace(" ""_"$nombre);
    
$nombre str_replace(".""_"$nombre);
    
    
$nombre str_replace("__""_"$nombre);
    
    return 
$nombre;
}

$archivo "este. es.mi. archivo.jpg";

//Dividimos el nombre del archivo separando por .
$partes explode("."$archivo);

//cortamos la ultima porcion del array, que es la que corresponde a la extension
$extension array_pop($partes);

//unimos el resto del array para formar el nombre sin la extension
$nombre implode(".",$partes);

//Limpiamos el nombre y le unimos la extension
$nombre_limpio filtro($nombre) . "." $extension;

echo 
"<strong>Nombre Sin limpiar</strong> " $archivo "<br>";
echo 
"<strong>Nombre Limpio</strong> " $nombre_limpio;

?>

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #6 (permalink)  
Antiguo 04/02/2007, 11:11
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 20 años
Puntos: 34
Re: problema con move_uploaded_file

El tema es que hay sistemas que tiene problemas no solo con eso, sino con caracteres como }{ o ä, etc...
Con esta función limpiamos de todita cosa rarona:

Código PHP:
function fileSystemName($nombre){
    
$search = array(
        
chr(192),chr(193),chr(194),chr(195),chr(224),chr(225),chr(226),chr(227), // a
        
chr(201),chr(202),chr(233),chr(234), // e
        
chr(205),chr(237), // i
        
chr(211),chr(212),chr(213),chr(243),chr(244),chr(245), // o
        
chr(218),chr(220),chr(250),chr(252), // u
        
chr(199),chr(231), // c
        
chr(209),chr(241// ñ
    
); 
    
$replace = array(
        
'a','a','a','a','a','a','a','a',
        
'e','e','e','e',
        
'i','i',
        
'o','o','o','o','o','o',
        
'u','u','u','u',
        
'c','c',
        
'n','n'
    
);
    
$aux strtolower(str_replace($search$replace$nombre));    
    
$aux preg_replace('/[^a-z0-9]/','',$aux);
    return 
$aux;

__________________
Mi punto de partida es Que Bueno Lo Nuevo
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 07:01.