Subir ficheros de forma directa (RFC 1867) en Nginx con "client_body_in_file_only"

Los formularios HTML permiten subir ficheros al servidor web de forma cómoda para el usuario pero tiene sus limitaciones. Una de las limitaciones es la subida de ficheros de forma automatizada por parte del cliente.

El estándar RFC 1867 permite facilitar la subida directa haciendo que la subida / recepción de ficheros sea directa, se va a mostrar como configurar de forma básica y simple el servidor web Nginx para implementar este tipo de subidas.

Uso recomendado: Ficheros binarios o texto sin caracteres ascii imprimibles de poco tamaño.

Documentación: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only

Configuración Nginx: /etc/nginx/nginx.conf

location /uploads {
 
limit_except POST           { deny all; }
client_body_temp_path       /tmp/;
client_body_in_file_only    on;
client_body_buffer_size     128K;
client_max_body_size        50M;
 
proxy_pass_request_headers  on;
proxy_set_header            X-FILE $request_body_file; 
proxy_set_body              off;
proxy_redirect              off;
proxy_pass                  http://dominio.com/receptor.php;
}

Para la configuración dada, si un cliente envía un fichero al servidor (por ejemplo con Curl) a la URL http://dominio.com/uploads, Nginx actúa como proxy y coloca el archivo automáticamente en el directorio /tmp del servidor. Después, el servidor web cede el control de ese fichero al wackend http://dominio.com/receptor.php, que es el que trabajará con ese fichero una vez subido (hacer comprobaciones, gurdarlo, transformarlo, etc). el script “receptor.php” utiliza la cabecera “X-FILE” enviada por nginx para conocer la ruta y nombre del fichero subido (Ej. /tmp/000001).

Subir ficheros http / https con curl (RFC 1867) de forma directa.

curl --data-binary '@fichero_subir.rar' http://dominio.com/uploads