• Viernes 3 de Mayo de 2024, 10:54

Autor Tema:  Validar Upload De Archivos Al Servidor  (Leído 2175 veces)

Mellileo

  • Miembro MUY activo
  • ***
  • Mensajes: 110
    • Ver Perfil
Validar Upload De Archivos Al Servidor
« en: Miércoles 7 de Septiembre de 2005, 23:42 »
0
Hola Genios

agradecería mucho a quien me ayudara con este problemilla!!

Resulta que tengo un script que realiza un upload de archivos al servidor web, pero necesito validar que los archivos que se suban sean únicamente de texto (planos).  He tratado de hacerlo manipulando los tipos MIME pero la comparación del tipo de archivo con la extención del mismo (según textos de consulta) no funciona... para entender un poco más el problemilla les mostraré parte del código que tengo:

Código: Text
  1. function SubirArchivo()
  2. {
  3.   global $HTTP_POST_FILES;
  4.   //datos del arhivo
  5.   $nombre_archivo = $HTTP_POST_FILES['userfile']['name'];
  6.   $tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
  7.   $tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
  8.   //compruebo si las características del archivo son las que deseo
  9.   if (!(strpos($tipo_archivo, "txt") && ($tamano_archivo < 600000)) {
  10.     echo "Nombre del fichero: $nombre_archivo"."<br>";
  11.     echo "Tamaño del fichero: $tamano_archivo <br>";
  12.     echo "Tipo del fichero: $tipo_archivo <br>";
  13.    
  14.     echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
  15.   }else{
  16.     if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],  "modules/mat_validar/temp/".$nombre_archivo)){
  17.       // Carga los datos del archivo plano a la tabla de la BD.
  18.       CargarDatos();
  19.     }else{
  20.       echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
  21.     }
  22.   }
  23. }
  24.  

Cómo hago para que valide que solamente suba archivo planos (.txt)???

Mil gracias por cualquier ayuda que me puedan ofrecer!!

Saludos,

Mellileo!!
Saludos...

Mellileo!!

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 448
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #1 en: Jueves 8 de Septiembre de 2005, 14:02 »
0
Hola! En caso de que quieras comparar si un archivo es de tipo texto plano deberás comprobar que $tipo_archivo contiene el valor text/plain.

Pero si lo que quieres es comprobar si la extensión del archivo es .txt puedes hacerlo de esta forma

Código: Text
  1. $extension = substr($nombre_archivo, strrpos($nombre_archivo, "."));
  2.  
  3. if ((strtolower($extension) == ".txt") && ($tamano_archivo < 600000)) {
  4.    // aquí tu código ...
  5. }
  6.  
  7.  


Espero que te sirva!

Salu2,
Avalon

Mellileo

  • Miembro MUY activo
  • ***
  • Mensajes: 110
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #2 en: Viernes 9 de Septiembre de 2005, 18:08 »
0
Hola de nuevo...

Gracias Avalon por tu ayuda.  Es muy interesante y útil tu recomendación sobre la extención del archivo, pero lo que requiero es que valide lo que mencionaste primero, que el archivo que se suba al servidor sea uno de tipo text/plain.

He tratado de hacerlo de la siguiente manera pero no me funciona:
Código: Text
  1.  
  2. $nombre_archivo = $HTTP_POST_FILES['userfile']['name'];
  3.   $tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
  4.   $tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
  5.   //compruebo si las características del archivo son las que deseo
  6.   if (!strpos($tipo_archivo, "text/plain") && ($tamano_archivo <= 600000)) { //Conjunto de instrucciones }
  7.  
  8.  

Cómo hago para que en la comparación con strpos(...) defina si es plano o no???

Mil gracias de nuevo por la ayude que me puedan prestar!!!
Saludos...

Mellileo!!

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 448
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #3 en: Lunes 12 de Septiembre de 2005, 13:49 »
0
Hola! En este caso has de tener en cuenta que la función strpos retornará 0 si la subcadena text/plain se encuentra en la primera posición de la cadena $tipo_archivo, y ese 0 va a ser interpretado por tu if como false cuando en realidad debería hacerlo como true, pués realmente SI existe la subcadena dentro de la cadena. No se si me explico...

Como esto va a ser así siempre que el tipo de archivo sea text/plain te recomiendo que hagas la comparación directamente, sin usar esa función

Citar
if ($tipo_archivo != "text/plain") { //El archivo no es de tipo texto plano }

Cualquier duda, aquí estamos :D

Salu2,
Avalon

Mellileo

  • Miembro MUY activo
  • ***
  • Mensajes: 110
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #4 en: Lunes 12 de Septiembre de 2005, 22:01 »
0
Gracias avalon!!!

Estoy muy agradecido con tu colaboración pues he realizado la validación como tu me la haz planteado y funciona a la perfección,  Gracias muchas gracias por eso.  

Respecto a la explicación de la función strpos(), he entendido lo que medices y tiene sentido, pero lo extraño del caso es que cuando lo hago con archivos tipo Gif o JPG funciona de maravilla.... es eso lo que me perturba, por qué con ese tipo de archivos si funciona bien, mientras que con los planos no... eso es un caso de estudio interesante.  Para que lo pongas en funcionamiento y verifiques lo que digo aquí está el código para que funcione subiendo imagenes.

Este es el código que carga la imagen a subir al servidor:

Código: Text
  1. <form action="subearchivo.php" method="post" enctype="multipart/form-data">
  2.     <input type="hidden" name="MAX_FILE_SIZE" value="100000">
  3.     <br>
  4.     <b>Enviar un nuevo archivo: </b>
  5.     <br>
  6.     <input name="userfile" type="file">
  7.     <br>
  8.     <input type="submit" value="Enviar">
  9.   </form>
  10.  

Y este es le código del archiivo que recibe lo enviado por el script anterior:

Código: Text
  1. //datos del arhivo
  2. $nombre_archivo = $HTTP_POST_FILES['userfile']['name'];
  3. $tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
  4. $tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
  5. //compruebo si las características del archivo son las que deseo
  6. if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000))) {
  7.   echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
  8. }else{
  9.   if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],  $nombre_archivo)){
  10.     echo "El archivo ha sido cargado correctamente.";
  11.   }else{
  12.     echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
  13.   }
  14. }
  15.  

Pruébalo y saca tus conclusiones....

De todas formas muchas gracias por tu ayuda... he resuelto el problema gracias a ti!!!

Saludos...
Saludos...

Mellileo!!

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 448
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #5 en: Martes 13 de Septiembre de 2005, 11:21 »
0
Hola Mellileo! La explicación es sencilla. Igual que los archivos de texto plano son de tipo text/plain, tenemos que los archivos de imagen GIF son de tipo image/gif y los archivos JPEG son de tipo image/jpeg.

Cuando tú buscas la subcadena gif dentro del tipo de archivo (en este caso image/gif) la función strpos va a retornar un valor distinto de 0 porque como puedes ver la subcadena gif no se encuentra en la posición 0 sinó en la posición 6. Por eso te funciona.

En cambio si buscaras con strpos la posición de la subcadena image/gif como hacías con text/plain no funcionaría ya que retornaría el valor 0.

Espero que haya quedado un poco más claro ;)

Salu2,
Avalon

Mellileo

  • Miembro MUY activo
  • ***
  • Mensajes: 110
    • Ver Perfil
Re: Validar Upload De Archivos Al Servidor
« Respuesta #6 en: Viernes 30 de Septiembre de 2005, 23:11 »
0
Hola Avalon:

He leido tu ecplicación y he despejado mi duda... muchas gracias por tu tiempo y colaboración!!!
Saludos...

Mellileo!!