Desarrollo de aplicaciones web con PHP y MySQL
Interactuando con el servidor
Sergio Sáez y José Luis Poza
© 2015 Sergio Sáez y José Luis Poza

1. Introducción

En las aplicaciones en las que se quiere que el usuario sea capaz de actualizar los contenidos del servidor se requiere:

2. Subiendo ficheros al servidor en PHP

Subir el fichero:
<form enctype="multipart/form-data" action="upload.php" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="1024">
  Subir el fichero: <input type="file" name="fichero"><br>
  <input type="submit" value="Enviar fichero">
</form>

3. Acceso al fichero desde PHP

<?php
$uploaddir 
'/var/www/uploads/';
if (!
is_uploaded_file($_FILES['fichero']['tmp_name'])) {
    echo 
"El fichero no se ha enviado correctamente. <br>\n";

} elseif (
$_FILES['fichero']['size'] <= ||
          
$_FILES['fichero']['size'] > MAX_SIZE) {
    echo 
"El fichero es demasido grande o está vacio. <br>\n";

} elseif (
$_FILES['fichero']['type'] != "text/plain") {
    echo 
"El fichero no es del tipo solicitado. <br>\n";

} elseif (
move_uploaded_file($_FILES['fichero']['tmp_name'],
                        
$uploaddir $_FILES['fichero']['name'])) {
    echo 
"El fichero se ha recibido correctamente. <br>\n";
} else {
    echo 
"Error al mover el fichero. Error: " .
         
$_FILES['fichero']['error']. ". <br>\n";
}
?>

4. Ficheros de configuración asociados

/etc/mime.types
Contiene la descripción de los tipos de archivo MIME y las posibles extensiones. Se puede encontrar en http://www.iana.org/assignments/media-types/. Ejemplos:
application/pdf                                 pdf
application/postscript                          ps ai eps
image/png                                       png
image/jpeg                                      jpeg jpg jpe
/etc/php5/apache2/php.ini
Contiene información sobre las caracteríticas del proceso de subida de ficheros en PHP.
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

5. Accediento al sistema de ficheros

Una vez se ha recibido el fichero desde el usuario y se ha almacenado en un directorio quizás se necesite:

Vamos a ver un conjunto de funciones que nos van a permitir llevar a cabo estas acciones.

6. Examinando directorios

<?php resource opendir (string path); ?>
<?php string readdir (resource dir_handle); ?>
<?php void closedir (resource dir_handle); ?>
<?php void rewinddir (resource dir_handle); ?>
$ ls -la
total 244
drwxr-xr-x  3 ssaez ssaez   4096 jul 21 18:35 .
drwxr-xr-x 23 ssaez ssaez   4096 jul 20 19:52 ..
-rw-r--r--  1 ssaez ssaez      0 sep 16  2013 0
-rw-rw-r--  1 ssaez ssaez  10992 jul 18  2014 10-accediendo-al-servidor.fmt
-rw-rw-r--  1 ssaez ssaez  28792 jul 21 18:35 10-accediendo-al-servidor.html
-rw-rw-r--  1 ssaez ssaez 185399 jul 20 10:38 10-accediendo-al-servidor-print.pdf
drwxr-xr-x  5 ssaez ssaez   4096 jul 21 18:35 ejercicios
-rw-rw-r--  1 ssaez ssaez      0 jul 16  2014 index.html
-rw-r--r--  1 ssaez ssaez    232 sep 16  2013 Makefile
<?php
if ($handle opendir('.')) {
  echo 
"\n **** Primera pasada ****\n";
  
/* De esta forma no habrá problemas
     con los nombres de los ficheros (v.g. 0). */
  
while (false !== ($file readdir($handle))) {
      echo 
"$file\n";
  } 
// endwhile
  
echo "\n **** Segunda pasada ****\n";
  
/* Éste podría terminar antes del final. */
  
rewind($handle);
  while (
$file readdir($handle)) {
      echo 
"$file\n";
  }
  
closedir($handle);
}
?>
 **** Primera pasada ****
10-accediendo-al-servidor.html
0
10-accediendo-al-servidor-print.pdf
Makefile
.
..
10-accediendo-al-servidor.fmt
index.html
ejercicios

 **** Segunda pasada ****
10-accediendo-al-servidor.html

7. Información sobre el directorio

<?php string dirname (string path); ?>
<?php string basename (string path [, string suffix]); ?>
<?php string realpath (string path); ?>
<?php float disk_free_space (string directory); ?>
<?php float disk_total_space (string directory); ?>

8. Creando y borrando directorios

<?php bool rmdir (string dirname); ?>
<?php bool mkdir (string pathname [, int mode]); ?>
<?php int umask ([int mask]); ?>

Existen multitud de funciones que permiten obtener información sobre un fichero: si es un fichero, un directorio, un enlace, si es ejecutable, si se puede mofificar, etc.

9. Ejecución de programas

<?php string exec (string command [, array output
                
[, int return_var]]); ?>
<?php string system (string command [, int return_var]); ?>
<?php void passthru (string command [, int return_var]); ?>

10. Control de acceso con apache

ErrorDocument 401 /home/ssaez/php/include/error_401.php
AuthUserFile /home/ssaez/php/user.passwd
AuthGroupFile /home/ssaez/php/group.passwd
AuthName "Curso de PHP y MySQL"
AuthType Basic
require valid-user
ErrorDocument error_code URL
Indica qué página debe mostrarse en caso de error. 401 es acceso denegado.
AuthUserFile file y AuthGroupFile file
Le indica a Apache dónde encontrar las claves de acceso para usuarios y los nombres de los grupos.

Este fichero se puede crear y actualizar con la orden htpasswd.

AuthName "name"
Nombre de la zona restringida. Se le muestra al usuario para indicarle qué clave se le está solicitando.
AuthType Basic
Indica que vamos a utilizar el mecanismo básico de autentificación. No hay otro implementado ;-)
require who_is_authorized
Indica a quién se le autoriza a acceder: usuarios y grupos concretos o cualquiera que sea un usuario válido.

11. Información de seguridad

PHP_AUTH_USER o REMOTE_USER
Contiene el usuario que se ha autentificado.
PHP_AUTH_PW
Contiene la clave con la que se ha autentificado sin cifrar.
HTTP_REFERER
Contiene la página desde la que hemos llegado a la página actual. Se puede utilizar para eliminar los accesos directos desde el exterior.