Tengo un pequeño servidor http que genera algunas imágenes sobre la marcha, y el proceso de generación puede llevar algún tiempo. Después de la generación, la imagen se almacena en caché de forma indefinida.

Actualmente, si un usuario solicita una imagen que no está almacenada en caché, el servidor devuelve un 202 Accepted con un encabezado Refresh. Si la imagen está almacenada en caché, se envía un 301 Permanently Moved y el usuario se redirige a una URL única (diferentes imágenes pueden compartir la misma URL única).

Todo el sistema se rompe si se hace referencia a la imagen en una etiqueta <img> (en Firefox, al menos). ¿Se puede solucionar esto sin Javascript? Si no es así, ¿cómo se vería el guión?

5
moatPylon 29 may. 2012 a las 14:38
¿No puede simplemente bloquear la solicitud mientras está procesando y responder directamente con la imagen real cuando esté listo? ¿Cuánto tiempo lleva la generación de tu imagen?
 – 
lanzz
29 may. 2012 a las 14:40
Eso depende. Algunas imágenes pueden tardar hasta un par de minutos en generarse, mientras que otras sólo tardan unos segundos. El bloqueo no es una opción.
 – 
moatPylon
29 may. 2012 a las 14:41
¿Ha probado con http 200 OK y el encabezado Refresh? (Tiene más sentido un 202, pero por si acaso ...)
 – 
richardtz
29 may. 2012 a las 15:05
Solo lo probé. No funciona :(
 – 
moatPylon
29 may. 2012 a las 15:24
¿Por qué exactamente bloquear no es una opción? ¿Puede al menos bloquear durante 10 segundos antes de lanzar la respuesta de actualización para disminuir la cantidad de solicitudes repetidas al servidor?
 – 
Oleg V. Volkov
29 may. 2012 a las 18:29

1 respuesta

La mejor respuesta

No estoy seguro de si puede hacerlo sin Javascript, pero probablemente podría hacerlo con ajax. Quiero decir, apunte al servidor y luego verifique si está allí ... luego, si lo muestra, intente nuevamente 30 segundos después, podría ser algo como:

function getImage(img) {
 $.ajax({
            cache: true,
            url: <<ADDRESS>>,
            data: "",
            timeout: 60,
            error: function (jqXHR, error, errorThrown) {
                setTimeout(function() {
                    getImage(img);
                }, 30000);
            },
            success: function (data) {
                //set the image
            }
        });
}

Está bien, entonces estás esperando que la imagen baje en algún momento.

¿La única otra opción sería generar la imagen antes de que se solicite? Por ejemplo, si solo está creando una miniatura para una galería de fotos, ¿por qué esperar hasta que se solicite para generarla? ¿Solo generarlo tan pronto como lo tenga?

Espero que ayude / tenga sentido.

2
Chris 30 may. 2012 a las 11:26
¡Estupendo! Si error / sucess se reemplaza por statusCode {202: ..., 301: ...}, entonces debería funcionar con el sistema actual.
 – 
moatPylon
30 may. 2012 a las 12:53
Con suerte, el error o el objeto jqXHR debería proporcionarle el código de error real (use console.log en Google Chrome, ayuda mucho a ver qué tiene un objeto, etc.)
 – 
Chris
30 may. 2012 a las 13:18
+1 Para una solución viable, pero bloquear la solicitud realmente sería una mejor opción, incluso si el bloqueo requiriera una espera de 5 minutos, aún regresaría más rápido que usar este código (ya que regresaría tan pronto como se completara la generación, no la encuesta después de eso hasta 30 segundos después). Solo bloquearía la imagen en cuestión, no la página.
 – 
Basic
6 sep. 2012 a las 18:07