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. Formulario de envío de archivo
<FORM ENCTYPE="multipart/form-data"
ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE"
value="1000">
Enviar este archivo: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Enviar">
</FORM>
La _URL_ debe tener como destino un script PHP. El campo MAX_FILE_SIZE debe
encontrarse antes del campo INPUT
y su valor determina el tamaño máximo de archivo que se puede
enviar en bytes. Tras la recepción del archivo se definirán
en el script PHP destino las siguientes variables:
• $userfile - El archivo temporal que se ha guardado en el servidor.
• $userfile_name - El nombre original del archivo enviado.
• $userfile_size - El tamaño del archivo recibido.
• $userfile_type - El tipo mime del archivo si el navigador envio esta
información. Por ejemplo: "image/gif".
Es importante recordar que la primera palabra "$userfile"
de éstas variables corresponde al nombre
("NAME=") del campo "INPUT TYPE=file"del formulario. En
el ejemplo anterior usamos "userfile".
Los archivos enviados serán guardados en el directorio temporal por defecto
del servidor. Podemos variar este directorio
mediante la variable de entorno TMPDIR en el entorno donde corre PHP. No se
puede establecer este valor usando
putenv() desde un script PHP.
El script PHP que recibe el archivo enviado debe implementar las acciones que
se deben llevar a cabo con el archivo
acabado de recibir. Por ejemplo se podria utilizar $file_size para decidir descartar
los archivos que sean demadiado
pequeños o demasiado grandes. Sean cual sean las acciones a tomar se
debe borrar el archivo temporal o moverlo a algún
otro directorio.
El archivo recibido será eliminado inmediatamente del directorio temporal
al finalizar el script PHP que lo recibió si no ha
sido movido o renombrado.
El valor de MAX_FILE_SIZE no puede ser mayor que el tamaño del archivo
que se especifica en la variable
upload_max_filesize del archivo PHP3.ini o la correspondiente directiva php3_upload_max_filesize
de Apache. Por
defecto es 2 Megabytes.
El servidor CERN parece que elimina cualquier cosa antes del primer espacio
en blanco en la cabecera mime content-type
que recibe de los clientes. Mientras esto no varie, CERN httpd no podrá
soportar el envío de archivos.
Es posible el envio de varios archivos simultáneamente y poder clasificar
la información automáticamente por arrays. Esto
de hace de la misma manera en que se organizan por arrays los SELECT o CHECKBOX:
Nota: El soporte para múltiple envios de archivos se añadió
en la versión 3.0.10
Ejemplo. Formulario de envío multiple de archivos
<form action="file-upload.
html" method="post" enctype="multipart/form-data">
Enviar estos archivos:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Enviar">
</form>
Cuando el formulario es procesado, los arrays $userfile, $userfile_name, y
$userfile_size se crearán de alcance
global (igual que $HTTP_POST_VARS). Cada uno será un array con índice
numérico con los valores apropiados para los
archivos enviados.
Por ejemplo, supongamos que los siguientes archivos /home/test/review.html y
/home/test/xwp.out son
enviados. En este caso, $userfile_name[0] almacenaría el valor review.html,
y $userfile_name[1] almacenaría
el valor xwp.out. Así, $userfile_size[0] almacenaría el tamaño
de review.html y así con los valores siguientes.
PHP soporta el metodo HTTP PUT que usan aplicaciones como Netscape Composer
y Amaya de W3C. Las peticiones
PUT son más sencillas que el método POST. Un ejemplo:
PUT /path/filename.html HTTP/1.1
Esto normalmente significaría que el cliente remoto quiere salvar el
contenido como: /path/filename.html en tu árbol web.
Lógicamente no una buena idea que la gente pueda escribir en tu árbol
web. Para manipular esta petición debes decirle al
servidor que esta petición sea atendida por un script PHP. En Apache,
por ejemplo, se utiliza para esto la directiva Script en
los alguno de los archivos de configuración del servidor. Un sitio típico
de uso es dentro del bloque <Directory> o
quizás en el bloque <Virtualhost>. Una linia así
deberia hacer ésta función:
Script PUT /put.php3
Ésto le dice a Apache que envie todas peticiones PUT para URIs que contengan
esta linia al script put.php3. Se asume que
PHP se encuentra activo y con la extension php3 enlazada a él.
Dentro del script put.php3 se podría implementar algo así:
<? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>
Esto copiaria el archivo a la localización requerida por el cliente
remoto. Aqui se pueden ejecutar funciones de
autentificación de usuario o cualquier otro tipo de chequeo. El archivo
se guarda en el archivo temporal del sistema
servidor de la misma manera que el Método POST. Cuando la petición
finaliza, el archivo temporal es eliminado. En
consequencia el script dede proceder al trato de éste inmediatamente,
ya sea para copiarlo, renombrarlo, etc. El archivo se
encuentra en la variable $PHP_PUT_FILENAME, y el destino sugerido por el cliente
en la variable $REQUEST_URI
(puede variar en servidores diferentes de Apache). No es necesario hacer caso
al destino sugerido por el cliente. Por
ejemplo se podrían copiar los archivos enviados a directorios especialmente
designados para esta tarea.
|
Anterior: autentificacion http con php |
Siguiente: conexiones en php |
| articulos relacionados |