lunes, 21 de septiembre de 2009

Clase para subir archivos (PHP)

En nuestros desarrollos para la web no sólo debemos ingresar datos a través de campos de textos sino que además, debemos subir archivos ya sea de imagen, texto, etc. Hace tiempo atrás me salió un proyectito en que esto era una constante por lo que opté por escribir una clase.

Advertencia antes de usar: Escribo partiendo de la base que conocen la variable global $_FILES.

Esta clase tiene los siguientes atributos:

  • archivo : El archivo en sí mismo. Este atributo corresponde a la variable $_FILES['archivo']['name'].
  • directorio: Cadena que contiene la ruta al directorio de destino.
  • tipoArchivo: Nos indica a que tipo de archivo corresponde. Esto se obtiene a través del método $this->getTipoArchivo() aplicado al atributo archivo.
  • tipoPermitido: Array con las extensiones de los tipos de archivos permitidos.
  • tamanoArchivo: Tamaño del archivo a subir, se obtiene desde la variable $_FILES['archivo']['size']
  • tmp: Directorio temporal en donde está cargado el archivo en espera a su manipulación. Se obtiene desde la variable $_FILES['archivo']['tmp_name'].
  • nombre: Junto con tipoArchivo forma el nombre que tendrá finalmente el archivo en el directorio de destino. 
  • tamanoMaximo: Entero que indica el tamaño máximo que tendrá el archivo. Esto se anota en Megas.
Sus métodos son:

  • __construct: Constructor de la clase. Los parámetros que recibe son:
    • archivo: Corresponde a la variable $_FILES['archivo']['name'].
    • dir: Cadena con la ruta al directorio de destino. Ej "var/www/sitio/".
    • extPermitida: Array con los tipos de archivos permitidos. Ej. array("doc","xls").
    • tamano: Corresponde a la variable $_FILES['archivo']['size'].
    • tmp: Corresponde a la variable $_FILES['archivo']['tmp_name'].
    • nombre: Cadena con el nombre que tendrá finalmente el archivo. Sino se indica toma lo indicado en la variable archivo.
    • tamPermitido: Entero que indica el tamaño máximo del archivo a subir, sino se indica entonces considera lo indicado en la variable de entorno upload_max_filesize.
  • getTipoArchivo: Obtiene la extensión que permite identificar el tipo de archivo que estamos manipulando. Tiene como parámetro de entrada el nombre del archivo (está basado en algo que publiqué hace un tiempo) Se usa en el constructor.
  • checkType: Revisa que el archivo a subir corresponda con los tipos permitidos.
  • checkSize: revisa que el archivo a subir tenga un tamaño MENOR al máximo permitido.
  • upLoadFile: Llama a los 2 métodos anteriores, más una comprobación de duplicación de archivos. Si cumple entonces sube el archivo por medio de la función nativa de PHP move_uploaded_file().
  • delFile: Borra el útlimo archivo subido.
Por último cuando trabajen con carga de archivos deben SIEMPRE considerar lo siguiente:
  • Cuidado con el tipo de archivos permitidos en la carga, podemos dejar abierta la puerta para que ingresen archivos maliciosos ocasionando más de un dolor de cabeza a uds. o a quienes tengan acceso.
  • La carpeta de destino debe tener permisos de escritura pero no de ejecución.
  • El tamaño máximo debe mantener el equilibrio entre las necesidades del desarrollo, lo permitidos por las directivas de PHP y el ancho de banda del cliente que sube un archivo.
Accesos:

11 comentarios:

  1. Anónimo11:47 a.m.

    hola dos preguntas, como podria hacer para darle permisos de escritura a una carpeta en windows

    ResponderEliminar
  2. Anónimo12:01 p.m.

    y como podria solo guardar el nombre del archivo e la bd postgres

    ResponderEliminar
  3. En Windows los permisos de archivos y carpetas los asignas en Propiedades (click derecho sobre el ícono->Propiedades), pestaña seguridad.

    Si sólo deseas guardar el nombre del archivo accede al nombre de éste mediante $_FILE['archivo']['name'] y listo.

    ResponderEliminar
  4. Anónimo11:07 p.m.

    alguien tiene los archivos ya no existe la web

    ResponderEliminar
  5. Ya están corregidas las rutas a los archivos.

    ResponderEliminar
  6. Anónimo12:10 a.m.

    Gracias amigo

    Estoy empezando con oop y esto me sera de mucha ayuda

    ResponderEliminar
  7. Está muy buena esta clase, felicitaciones.

    Con respecto a eliminar ¿Solo elimina el último archivo subido?.

    Saludos y gracias

    ResponderEliminar
    Respuestas
    1. Sí, pero puedes la función nativa unlink() -de hecho la clase la utiliza- para eliminar cualquier otro archivo.

      Eliminar
  8. 1333nvz2:36 a.m.

    ¡Excelente clase!
    Ahora algunas consultas: ¿como especifico el nombre del archivo? y además, ¿cómo puedo usarla a nivel local? Me arroja el siguiente error: "Strict Standards: Only variables should be passed by reference in ..."
    Desde ya muchas gracias.

    ResponderEliminar
    Respuestas
    1. Ese error es causado porque explode no puede devolver valores por referencia directamente.

      Así pues, en la clase Archivo en el método getTipoArchivo() debería estar construido de la siguiente manera para acatar los estándares:

      if ($archivo != '') {

      $extension = explode(".",strtolower($archivo));
      $extension = end($extension);

      return $extension;

      }

      Saludos. n.n

      Eliminar