PHP ofrece soporte para el método PUT de HTTP utilizado por algunos clientes para almacenar ficheros en un servidor. Las peticiones PUT son mucho más simples que una subida de ficheros mediante peticiones POST. Se ven algo como esto:
PUT /ruta/nombrefichero.html HTTP/1.1
Esto normalmente significaría que el cliente remoto quiere guardar el contenido que le sigue como: /ruta/nombrefichero.html en el árbol web. Obviamente, no es una buena idea que Apache o PHP permitan a todo el mundo sobrescribir automáticamente cualquier fichero del árbol web. Por tanto, para manejar tales peticiones se debe primero indicar al servidor web que cierto script de PHP maneje la petición. En Apache, esto se hace con la directiva Script. Esta se puede colocar casi en cualquier parte del fichero de configuración de Apache. Un lugar común es dentro de un bloque <Directory> o tal vez dentro de un bloque <VirtualHost>. Una línea como ésta resolvería el problema:
Script PUT /put.php
Esto le indica a Apache que envíe todas las peticiones PUT para los URI que coincidan con el contexto en el cual se pone esta línea en el script put.php. Se asume, por supuesto, que se tiene habilitado PHP para la extensión .php y que PHP está activo. El recurso de destino para todas las peiticiones PUT a este script tiene que ser el propio script, no el nombre de fichero que debería tener el fichero subido.
Entonces, con PHP se haría algo como lo siguiente en el fichero put.php. Se copiaría el contenido del fichero subido al fichero mificheroput.ext en el servidor. Podría ser conveniente realizar algunas comprobaciones y/o autenticar al usuario antes de realizar esta copia del fichero.
Ejemplo #1 Guardar ficheros PUT de HTTP
<?php
/* Los datos de PUT vienen en el flujo de entrada estándar */
$datosPUT = fopen("php://input", "r");
/* Abrir un fichero para escritura */
$fp = fopen("mificheroput.ext", "w");
/* Leer 1 KB de datos cada vez
y escribir en el fichero */
while ($datos = fread($datosPUT, 1024))
fwrite($fp, $datos);
/* Cerrar los flujos */
fclose($fp);
fclose($datosPUT);
?>