Una de las responsabilidades de mi aplicación Rails es crear y servir xmls firmados. Cualquier xml firmado, una vez creado, nunca cambia. Así que guardo cada xml en la carpeta public
y redirijo el cliente de manera apropiada para evitar el procesamiento innecesario desde el controlador.Servicio de archivos zip dinámicos a través de Apache
Ahora quiero una nueva característica: cada xml está asociado con una fecha, y me gustaría implementar la capacidad de servir un archivo comprimido que contenga cada xml cuya fecha se encuentre en un período especificado por el cliente. Sin embargo, el período no puede limitarse a menos de un mes para que la función sea útil, y esto implica que algunos archivos comprimidos que se sirven serán tan grandes como 50M.
Mi aplicación se implementa como un módulo de Pasajeros de Apache. Por lo tanto, es totalmente inaceptable servir el archivo con send_data
, ya que el cliente tendrá que esperar a que se genere todo el archivo comprimido antes de que comience la descarga. Aunque tengo una idea sobre cómo implementar la función en Rails para que se produzca el archivo comprimido mientras recibo el servicio, creo que mi servidor escasea en recursos una vez que se asignan algunos largos procesos Ruby/Passenger para servir archivos zip grandes.
He leído acerca de a better solution para servir archivos estáticos a través de Apache, pero no los dinámicos.
Entonces, ¿cuál es la solución al problema? ¿Necesito algo así como un controlador de Apache personalizado? ¿Cómo informo a Apache, desde mi aplicación, cómo manejar la solicitud, comprimir los archivos y transmitir el resultado de forma simultánea?
El índice formato de archivo ZIP se encuentra al final del archivo. También eché un vistazo rápidamente a través de RFC 2616 (HTTP 1.1) y la respuesta de longitud variable como esa probablemente funciona, aunque generalmente debe anunciarse la duración del contenido. Técnicamente esto debería ser posible por lo que puedo ver. – erloewe
No existe un problema de HTTP al no saber la longitud por adelantado, para esto sirve la codificación de transferencia fragmentada. Puede escribir bytes que se parecen a un archivo zip en cualquier idioma, solo asegúrese de enjuagar su salida periódicamente. – covener