Envío de archivos con el método POST
PHP es capaz de recibir envíos de archivo de cualquier navegador
que cumpla la norma RFC_1867 (entre los que se incluyen Netscape
Navigator 3 o posterior, Microsoft Internet Explorer 3 con un
parche o posterior sin éste)_ Ésta característica permite que los
usuarios envien archivos de texto y binarios_ Mediante la
autentificación y funciones de manejo de archivos de PHP, es
posible un control total de quién puede enviar archivos y que se
hace con éstos una vez recibidos_
Es importante destacar que PHP también soporta el método PUT
para envío de archivos tal y como lo utiliza Netscape Composer
y el cliente Amaya de W3C_ Consulte
Soporte del método PUT para más detalles_
Una página de envío de archivos se puede crear mediante un formulario
parecido a éste:
Ejemplo 18_1_ Formulario de envío de archivo <form enctype="multipart/form_data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form> |
|
La _URL_ debe tener como destino un script PHP_ El input oculto MAX_FILE_SIZE
debe encontrarse antes del input de tipo "file" para indicar
el tamaño máximo de archivo que se puede enviar en bytes
| Aviso |
MAX_FILE_SIZE debe ser consultado por el navegador; aun así es
sencillo saltarse este máximo por lo tanto no se debe presuponer
que el navegador siempre lo respetará_ En contrapartida,
la configuracion de PHP relativa al tamaño maximo no puede
ser obviada_
|
Las variables definidas para los archivos enviados varian
en función de la versión y configuración de PHP que se utilice_
Las variables de las que hablamos a continuación serán
definidas en la página destino despues de una recepción de fichero correcta_
Cuando track_vars este activado,
el array $HTTP_POST_FILES/$_FILES se inicializará_ Por ultimo, las
variables relacionadas seran inicializadas como globales cuando
register_globals esté
habilitado_ Cabe señalar que el uso de las variables globales
no esta recomendado en ningún caso_
Nota:
track_vars esta activado siempre
desde PHP 4_0_3_ A partir de PHP 4_1_0 , $_FILES puede ser utilizado
alternativamente a $HTTP_POST_FILES_
$_FILES es siempre global asi que global
no debe ser usado con $_FILES en el ámbito de función_
$HTTP_POST_FILES/$_FILES contienen
la información sobre el fichero recibido_
A continuación se describe el contenido de
$HTTP_POST_FILES_
Se ha tomado el nombre 'userfile' para el fichero recibido tal y
como se usaba en el script de ejemplo anterior:
- $HTTP_POST_FILES['userfile']['name']
El nombre original del fichero en la máquina cliente_
- $HTTP_POST_FILES['userfile']['type']
El tipo mime del fichero (si el navegador lo proporciona)_ Un ejemplo
podría ser "image/gif"_
- $HTTP_POST_FILES['userfile']['size']
El tamaño en bytes del fichero recibido_
- $HTTP_POST_FILES['userfile']['tmp_name']
El nombre del fichero temporal que se utiliza para almacenar en el
servidor el archivo recibido_
Nota:
A partir de PHP 4_1_0 se puede utilizar el variable corta
$_FILES_ PHP 3 no soporta
$HTTP_POST_FILES_
Cuando register_globals
se activa en el php_ini las siguientes variables son accesibles_
Se ha tomado el nombre 'userfile' para el fichero recibido tal y
como se usaba en el script de ejemplo del principio:
$userfile _ El nombre del fichero temporal que
se utiliza para almacenar en el servidor el archivo recibido_
$userfile_name _ El nombre original del fichero
en la máquina cliente_
$userfile_size _ El tamaño en bytes del fichero recibido_
$userfile_type _ El tipo mime del fichero
(si el navegador lo proporciona)_ Un ejemplo podría ser "image/gif"_
Se puede ver que "
$userfile" (en las
variables anteriores) toma el valor del atributo "name"
que contenga el campo <input> de tipo "file" del
formulario de envio_ En el ejemplo anterior, elegimos
llamarlo "userfile"_
Nota:
register_globals = On se desaconseja por
razones de seguridad y rendimiento_
Por defecto, los ficheros serán almacenados en el directorio
temporal por defecto del servidor a no ser que se especifique
otra localizacion con la directiva upload_tmp_dir en php_ini_
El directorio temporal por defecto del servidor puede ser
modificado cambiando el valor de la variable de entorno
TMPDIR en el contexto en que se ejecuta PHP
La configuración de las variables de entorno no se puede
realizar en PHP a través de la función putenv()_
Esta variable de entorio puede ser utilizada también para
asegurarnos que otras operaciones con archivos recibidos están
funcionando correctamente_
Ejemplo 18_2_ Verificando los archivos recibidos
Los siguientes ejemplos son validos para versiones de PHP 4
superiores a la 4_0_2_ Veanse las funciones
is_uploaded_file() y
move_uploaded_file()_
<?php
// In PHP 4_1_0 or later, $_FILES should be used instead of $HTTP_POST_FILES_
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {
copy($HTTP_POST_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack_ Filename: " _ $HTTP_POST_FILES['userfile']['name'];
}
/* ___or___ */
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
?> |
|
El script PHP que recibe el fichero, debe implementar la lógica
necesaria para determinar que debe ser realizado con el fichero_
Se puede utilizar, por ejemplo, la variable
$HTTP_POST_FILES['userfile']['size']
para descartar los ficheros demasiado chicos o demasiado grandes;
por otro lado, se puede usar la variable
$HTTP_POST_FILES['userfile']['type']
para descartar los que no se ajusten a algun criterio de tipo_
Cualquiera que sea la logica que utilicemos, se debe borrar
o mover el archivo del directorio temporal_
El archivo será borrado del directorio temporal al final de la petición
si no se ha movido o renombrado_