Acabado de subir el último de los ejercicios de PHP que colgué, voy a seguir un poco más con el tema de trabajar con ficheros y directorios. Ahora va un poco de teoría con la que espero poder dejar un poco más claro el código anterior (ya que los comentarios que acompañan a ese código son mis explicaciones de andar por casa… y no todo el mundo las entenderá … ni yo mismo las entiendo en muchas ocasiones).
Bueno, dicho esto, vamos al asunto …
Para empezar, decir que el recurso (resource) que devuelven las funciones opendir(), tmpfile() y openfile() es de tipo strem. Es destruido por las funciones closedir() y fclose().
Trabajando con ficheros y directorios mediante PHP
Las funciones relacionadas con los directorios:
- getcwd(): Devuelve el directorio actual de trabajo del script (Current Working Directory). Si falla devuelve FALSE.
- dirname (string $path): El parámetro que se le pasa por la cabecera (path) contiene la ruta a un fichero o un directorio. Esta función devuelve la ruta del directorio padre.
- basename (ruta): Esta no es una operación de ficheros propiamente dicha, sino más bien de cadenas de caracteres, ya que tanto lo que pasamos a la función como lo que obtenemos de ella, son strings. Dada una cadena de caracteres que definen una tura o posición de un fichero en el disco duro (separados los directorios por el caracter «/» o «»), basename() nos devuelve los caracteres que están después del último carácter que usamos como separador. Por ejemplo, si le aplicamos esta función a la cadena /hola/que/tal, obtendemos tal.
- dirname(ruta): Hace lo inverso a la función basename(), es decir, devuelve la ruta de directorios y subdirectorios donde está ubicado el fichero: los directorios por los que hay que pasar para encontrarlo; aplicando a «/hola/que/tal», obtendremos «/hola/que».
- disk_free_space(dir): Esta función toma una ruta a un directorio y devuelve el espacio libre en octetos disponibles en el sistema de ficheros que contiene al directorio.
- disk_total_space(dir): Toma una ruta a un directorio y devuelve el tamaño del sistema de fichero donde está situado dicho directorio.
Subir ficheros al servidor:
Para subir ficheros al servidor, tendremos que indicar el método de transferencia de los datos del formulario mediante POST y que viajarán codificador como multipart/form-data.
Opcionalmente, se puede expresar el tamaño máximo que podrá tener un fichero para poder ser enviado como un campo de datos oculto, al que hay que identificarlo como max_file_size (si no se indica se tomará la directiva upload_max_filesize).
<input type=»hidden» name=»max_file_size» value=»1000″>
Una vez transferido se almacena en el directorio que se especifica en el fichero php.ini a través de la directiva upload_tmp_dir.
Para poder trabajar con los ficheros así transmitidos. PHP nos proporciona el array asociativo $_FILES. Este array tiene dos dimensiones; en la primera columna se indican los ficheros que se han subido usando como claves los identificadores que usamos en la etiqueta <input>, mientras que las claves de la segunda columna se corresponderán con las características de cada fichero:
Clave | Descripción |
name | Nombre del fichero transferido. |
tmp_name | Nombre del fichero temporal donde está guardado el fichero recién subido. Si no se pudiera haber cumplido esta operación (por ejemplo, el fichero es demasiado grande), entonces obtendremos none. |
Type | El tipo MIME del fichero (indicado por el cliente) |
error | Código de error devuelto: indica cómo ha ido la transferencia. |
size | Tamaño en caracteres del fichero. |
Los códigos de error que podremos encontrarnos son los siguientes:
Valor | Constante | Significados |
0 | UPLOAD_ERR_OK | Sin errores |
1 | UPLOAD_ERR_INI_SIZE | El fichero es mayor que el tamaño indicado en la directiva upload_max_filesize del fichero de configuración php.ini |
2 | UPLOAD_ERR_FORM_SIZ | El fichero es mayor que el tamaño indicado en el campo oculto max_file_size |
3 | UPLOAD_ERR_PARTIAL | El fichero ha sido parcialmente transferido |
4 | UPLOAD_ERR_NO_FILE | No se ha transferido el fichero |
También dispondremos de un par de funciones útiles para trabajar con estos ficheros:
- is_uploaded_file ($_FILEs[‘identif_fich’][‘tmp_name’]: nos indica si el fichero ha sido subido.
- move_uploaded_files(nombre_fichero_original, destino): nos sirve para renombrar o mover el fichero temporal a otro que será permanente.
Directivas de PHP.INI involucradas:
La siguiente tabla muestra un resumen de las directivas del fichero php.ini que nos determinarán el comportamiento del intérprete PHP en lo que a transferencia de ficheros al servidor se refiere:
Directiva | Descripción |
file_uploads | En función del valor que tenga (on, off), permitirá o no subir ficheros al servidor. |
upload_tmp_dir | Directorio en el servidor donde se almacenan de manera temporal los ficheros que han sido subidos. |
upload_max_filesize | Limita el tamaño máximo que podrá tener un fichero para poder transferirse al servidor. Este valor prevalece sobre el valor dado en el campo oculto identificado como max_file_size. |