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:
hola dos preguntas, como podria hacer para darle permisos de escritura a una carpeta en windows
ResponderBorrary como podria solo guardar el nombre del archivo e la bd postgres
ResponderBorrarEn Windows los permisos de archivos y carpetas los asignas en Propiedades (click derecho sobre el ícono->Propiedades), pestaña seguridad.
ResponderBorrarSi sólo deseas guardar el nombre del archivo accede al nombre de éste mediante $_FILE['archivo']['name'] y listo.
alguien tiene los archivos ya no existe la web
ResponderBorrarYa están corregidas las rutas a los archivos.
ResponderBorrarGracias amigo
ResponderBorrarEstoy empezando con oop y esto me sera de mucha ayuda
Está muy buena esta clase, felicitaciones.
ResponderBorrarCon respecto a eliminar ¿Solo elimina el último archivo subido?.
Saludos y gracias
Sí, pero puedes la función nativa unlink() -de hecho la clase la utiliza- para eliminar cualquier otro archivo.
BorrarMuchas gracias.
Borrar¡Excelente clase!
ResponderBorrarAhora 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.
Ese error es causado porque explode no puede devolver valores por referencia directamente.
BorrarAsí 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