Foros del Web » Programando para Internet » PHP »

Controlar extensión al subir ficheros

Estas en el tema de Controlar extensión al subir ficheros en el foro de PHP en Foros del Web. Estoy utilizando un script para subir varios ficheros al servidor. Al subirlos se les da un nombre q previamente se lee de un fichero de ...
  #1 (permalink)  
Antiguo 22/11/2004, 04:42
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Controlar extensión al subir ficheros

Estoy utilizando un script para subir varios ficheros al servidor. Al subirlos se les da un nombre q previamente se lee de un fichero de texto. El primero archivo se llama como el contenido del .txt, el 2º se llama contenido_1 y el tercero se llama contenido_2

Ahora lo que quiero es obligar al usuario que el primer fichero tenga la extension htm y los otros dos sean pdf. He intentado meter un if al subirlos para que si no se cumple, los redireccione a la pagina anterior pasando un parametro indicando asi el error. (La pagina anterior es un asp) Pero me da el siguiente error:

Cita:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\DATOS\IntranetWeb\serviciosonline\circulares\su bir.php on line 47
La linea 47 es donde se indica que el destino de los archivos subidos. Os pongo todo el código para ver si alguien me puede echar una manita. Muchas gracias por adelantado a tod@, salu2

Código PHP:
<? 

$nombre 
file_get_contents("./tmp/temp1.txt",1);
$nombre trim($nombre);
$ruta file_get_contents("./tmp/temp2.txt",1);
$ruta trim($ruta);

$N 3//Número de archivos a Subir 

for($i=0$i<$N$i++) { 

if (
is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'][$i])) { 

$split_path split("/"$HTTP_POST_FILES['userfile']['name'][$i]); 
$split_path end ($split_path); 
$extension split("[/.]"$split_path); 

if (
end($extension) == "php" || end($extension) == "php3") { 

echo 
"tipo de archivo invalido"

} else { 

$RUTA_UPLOADED $ruta

$NOMBRE_FILE $split_path
if (
$i==0) {
    If(
end($extension) <> "htm") {
        
header("Location: nuevo.asp?fallo=1");
    }

    
$NOMBRE_FILE $nombre "." end($extension); 
}
if (
$i==1) {
    If(
end($extension) <> "pdf") {
        
header("Location: nuevo.asp?fallo=2");
    }
    
$NOMBRE_FILE $nombre "_1." end($extension); 
}
if (
$i==2) {
    If(
end($extension) <> "pdf"') {
        header("Location: nuevo.asp?fallo=2");
    }
    $NOMBRE_FILE = $nombre . "_2." . end($extension); 
}

LA SIGUIENTE ES LA LINEA 47
move_uploaded_file($HTTP_POST_FILES['
userfile']['tmp_name][$i], $RUTA_UPLOADED $NOMBRE_FILE); 




header("Location: subir3.asp");


?>
__________________
Vayamos por Partes :: Jack el Destripador
  #2 (permalink)  
Antiguo 22/11/2004, 04:57
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Weno, he cambiado algunas cosillas de las condiciones y parecia q funcionaba, pero sigo teniendo dos problemas. 1º) y más importante: Cuando la extensión es incorrecta redirige a la pagina anterior y muestra el mensaje de error, peeeeero, parece ser que el script termina de ejecutarse, y al llegar al final, redirige a subir3.asp, cosa que solo deberia hacer si todo está bien Es decir, primero redirige a la pagina anterior, y seguidamente redirige a la que sería la siguiente. Y el 2º problema se da tb por el exo d que se continua ejecutando el script, y es que aunq la extension esté mal, sube el archivo al servidor. No le cambia el nombre, por lo que después ese archivo no se tendrá en cuenta a la hora de las búsquedas, pero está ahi ocupando espacio en el servidor. Lo que yo quiero es que cuando rediriga a la página previa xq la extensión está mal, el resto del script no se ejecute. Como tengo que hacerlo??

Os dejo el código tal y como lo tengo ahora:

Código PHP:
<? 

$nombre 
file_get_contents("./tmp/temp1.txt",1);
$nombre trim($nombre);
$ruta file_get_contents("./tmp/temp2.txt",1);
$ruta trim($ruta);

$N 3//Número de archivos a Subir 

for($i=0$i<$N$i++) { 

if (
is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'][$i])) { 

$split_path split("/"$HTTP_POST_FILES['userfile']['name'][$i]); 
$split_path end ($split_path); 
$extension split("[/.]"$split_path); 

if (
end($extension) == "php" || end($extension) == "php3") { 

echo 
"tipo de archivo invalido"

} else { 

$RUTA_UPLOADED $ruta

$NOMBRE_FILE $split_path

if (
$i==0) {
    if (
end($extension) == "htm" ){ 
        
$NOMBRE_FILE $nombre "_1." end($extension); 
    } else {
        
header("Location: nuevo.asp?fallo=1");
    }
}

if (
$i==1) {
    if (
end($extension) == "pdf" ){ 
        
$NOMBRE_FILE $nombre "_1." end($extension); 
    } else {
        
header("Location: nuevo.asp?fallo=2");
    }
}

if (
$i==2) {
    if (
end($extension) == "pdf" ){ 
        
$NOMBRE_FILE $nombre "_1." end($extension); 
    } else {
        
header("Location: nuevo.asp?fallo=2");
    }
}


move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'][$i], $RUTA_UPLOADED $NOMBRE_FILE); 




header("Location: subir3.asp");


?>
Muchas gracias a tod@s
__________________
Vayamos por Partes :: Jack el Destripador

Última edición por angel_dope; 22/11/2004 a las 05:03
  #3 (permalink)  
Antiguo 22/11/2004, 08:49
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Nadie me puede ayudar??? :( Es muy urgente, pleeease
__________________
Vayamos por Partes :: Jack el Destripador
  #4 (permalink)  
Antiguo 22/11/2004, 11:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Usa un exit; tras cada header("Location: ....").

Se supone que cuando usas header("Location: pagina.tal") lo que se pretende es:
1) decir al navegador (cliente) que cabie la página que está viendo por otra.
2) terminar la ejecución de tu script en ese instante (y punto del flujo del programa) pues .. no quieres que se ejecute nada más acontinuación.

Puede ser que por la lógica que usas (grupos de if() . .en lugar de algo más complejo como un switch() o un if .. elseif .. else ...) se esté ejecutando el último "location" o el que la lógica haga llegar en el caso que te ocasiona los problemas. Usa exit; despues del header() y lo pruebas.

Un saludo,
  #5 (permalink)  
Antiguo 23/11/2004, 02:33
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Uy, no me habia llegado el aviso de esta respuesta... weno, de todas formas esta mañana me ha venido la inspiración y me acordé de algo que lei hace unos dias. Le he metido un die(""); despues de cada header y con eso ha funcionado de maravilla. Aunque supongo que con el exit hará lo mismo. Crees que es mejor usar el exit que el die, o da igual??
__________________
Vayamos por Partes :: Jack el Destripador
  #6 (permalink)  
Antiguo 23/11/2004, 07:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Tanto la función die() como exit() hacen lo mismo .. paran la ejecución del script en ese punto y .. opcionalmente si lo deseas puedes usar un mensaje de salida al terminar .. lo cual sería equivalente a un echo "aglo" ..+.. exit; o die() sin mensaje ..

Un saludo,
  #7 (permalink)  
Antiguo 23/11/2004, 07:26
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Otra pregunta más, a ver si me puedes ayudar. Me he dado cuenta que si el archivo es muy grande, no lo sube. Sea la extensión que sea. Además, si la extensión es incorrecta, no avisa de ellos, simplemente pasa de subir el archivo y redirige a la siguiente página, es decir, ejecuta la ultima instrucción. Supongo que para evitar esto último bastaria con meter la última instrucción dentro del primer if que hay en el bucle [ if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'][$i])) ] y poner un mensaje diciendo que no se ha subido el archivo. Pero como puedo saber cual es el tamaño máximo, y como puedo cambiarlo para que de igual el tamaño, ya que esto se usará solo en la red interna, y a pesar de que sean archivos grandes, la transferencia es muy rápida.
__________________
Vayamos por Partes :: Jack el Destripador
  #8 (permalink)  
Antiguo 23/11/2004, 08:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
El tamaño máximo para un Upload lo define en tu php.ini:

Cita:
Related Configurations Note: See also the file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size and max_input_time directives in php.ini
http://www.php.net/manual/en/features.file-upload.php

Tambien puedes tener problema con el tiempo que tarda tu script en procesar el "upload" del archivo (directamente proporcial con el tamaño del archivo y la conexión que uses entre tu cliente-servidor). Ese tema lo controlas con la función:

set_time_limit()
www.php.net/set_time_limit

(o en php.ini también)

Un saludo,
  #9 (permalink)  
Antiguo 24/11/2004, 03:47
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 22 años
Puntos: 8
Ok, ya está listo. Efectivamente el limite estaba en el php.ini y estaba puesto a 2 Mb, al final lo he dejado en 5, tampoco vamos a dejar que suban cualquier cosa jejeje. Muchas gracias Cluster
__________________
Vayamos por Partes :: Jack el Destripador
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 12:54.