gratiszona

Envio de archivos

Envio de archivos con el metodo POST

PHP es capaz de recibir envios 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 este). esta
caracteristica permite que los usuarios envien archivos de texto y binarios. Mediante la autentificacion y funciones de
manejo de archivos de PHP, es posible un control total de quien puede enviar archivos y que se hace con estos una vez
recibidos.
Es importante destacar que PHP tambien soporta el metodo PUT para envio de archivos tal y como lo utiliza Netscape
Composer y el cliente Amaya de W3C. Consulte Soporte del metodo PUT para mas detalles.
Una pagina de envio de archivos se puede crear mediante un formulario parecido a este:
Ejemplo. Formulario de envio 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 maximo de archivo que se puede enviar en bytes. Tras la recepcion del archivo se definiran
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 informacion. Por ejemplo: "image/gif".
Es importante recordar que la primera palabra "$userfile" de estas variables corresponde al nombre
("NAME=") del campo "INPUT TYPE=file"del formulario. En el ejemplo anterior usamos "userfile".
Los archivos enviados seran guarcuadrados 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 algun
otro directorio.
El archivo recibido sera eliminado inmediatamente del directorio temporal al finalizar el script PHP que lo recibio si no ha
sido movido o renombrado.

Errores comunes

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 podra soportar el envio de archivos.

Envio de mas de un archivo

Es posible el envio de varios archivos simultaneamente y poder clasificar la informacion automaticamente por arrays. Esto
de hace de la misma manera en que se organizan por arrays los SELECT o CHECKBOX:
Nota: El soporte para multiple envios de archivos se añadio en la version 3.0.10
Ejemplo. Formulario de envio 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 crearan de alcance
global (igual que $HTTP_POST_VARS). Cada uno sera un array con indice numerico 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] almacenaria el valor review.html, y $userfile_name[1] almacenaria
el valor xwp.out. Asi, $userfile_size[0] almacenaria el tamaño de review.html y asi con los valores siguientes.

Soporte del metodo PUT

PHP soporta el metodo HTTP PUT que usan aplicaciones como Netscape Composer y Amaya de W3C. Las peticiones
PUT son mas sencillas que el metodo POST. Un ejemplo:
PUT /path/filename.html HTTP/1.1
Esto normalmente significaria que el cliente remoto quiere salvar el contenido como: /path/filename.html en tu arbol web.
Logicamente no una buena idea que la gente pueda escribir en tu arbol web. Para manipular esta peticion debes decirle al
servidor que esta peticion sea atendida por un script PHP. En Apache, por ejemplo, se utiliza para esto la directiva Script en
los alguno de los archivos de configuracion del servidor. Un sitio tipico de uso es dentro del bloque <Directory> o
quizas en el bloque <Virtualhost>. Una linia asi deberia hacer esta funcion:
Script PUT /put.php3
esto 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 el.
Dentro del script put.php3 se podria implementar algo asi:
<? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>
Esto copiaria el archivo a la localizacion requerida por el cliente remoto. Aqui se pueden ejecutar funciones de
autentificacion 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 Metodo POST. Cuando la peticion finaliza, el archivo temporal es eliminado. En
consequencia el script dede proceder al trato de este 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 podrian copiar los archivos enviados a directorios especialmente designados para esta tarea.
Anterior: autentificacion http con php
Siguiente: conexiones en php