2011-03-18 18 views
6

Estoy construyendo una herramienta de administración de imágenes y quiero saber cómo puedo crear una experiencia similar a Vimeo.Procesamiento asincrónico asp.net mvc con retroalimentación de progreso del lado del cliente

Descripción de lo que debe suceder
El usuario será capaz de cargar muchos potencialmente grandes imágenes utilizando plupload (sin recarga de la página). Luego, el servidor realizará las siguientes acciones en cada imagen cargada.

  • La imagen se cambia el tamaño en varias versiones (por ejemplo el pulgar, pequeño, medio, grande)
  • Cada copia tendrá algunos de procesamiento de imagen hecho (por ejemplo, filtro convolución)
  • Estos redimensionado las copias se cargarán en Amazon S3
  • Se almacenará información sobre cada imagen en una base de datos (ancho, alto, mimetype, nombre de archivo)
  • A continuación, el servidor debe desencadenar algún tipo de información al usuario

Comentarios del lector Asyncronous (herramienta de carga de imágenes)
Plupload tiene muy buena retroalimentación visual al cargar los archivos a mi servidor, sin embargo, quiero para poder dar retroalimentación adicional al usuario mientras el servidor está haciendo todo el procesamiento de la imagen y cargando en el almacenamiento remoto.

Vimeo hace esto muy bien. Cuando sube un video, confirma que se ha cargado, pero luego dice "estamos codificando su video, espere" y la IU proporciona algún tipo de indicador de progreso.

Me gustaría dar al usuario dos tipos de comentarios después de que las imágenes se hayan cargado en mi servidor. Cada vez que una imagen ha sido procesado y enviado a S3 me gustaría:

  • actualización de un mensaje en el navegador diciendo "5 de 15 imágenes han sido procesados" y me gustaría
  • Tener una aparece una miniatura de esa imagen.

Acción Un controlador MVC Ejemplo

[HttpPost] 
public virtual ContentResult Upload(Guid albumId) 
{ 
    foreach (string file in Request.Files) 
    { 
    HttpPostedFileBase f = Request.Files[file] as HttpPostedFileBase; 
    if (f.ContentLength == 0) 
     continue; 

    var uploadDir = Server.MapPath("~/uploads/"+ albumId); 
    var filePath = Path.Combine(uploadDir, Path.GetFileName(hpf.FileName)); 
    f.SaveAs(filePath); 

    // How can I trigger some async task here that would be able 
    // to trigger some sort of feedback to the browser when complete? 
    SomeAsyncImageProcessor.ProcessImage(albumId, filePath); // ??? 
    } 

    return Content("Success", "text/plain"); 
} 

Restricciones
Las personas que utilizan esta aplicación web va a utilizar la última versión de Chrome. No es necesario abordar problemas entre navegadores. Estamos utilizando asp.net MVC 3 y SQL Server 2005

¿Alguien puede indicarme la dirección correcta? ¿Existen recursos geniales para mostrar cómo puedo lograr algo como esto?

+0

Esto se llama Comet (o ReverseAJAX), y actualmente no es muy compatible con IIS. Eche un vistazo a esto: http://stackoverflow.com/questions/2259633/how-to-implement-reverseajax-comet-in-asp-net-mvc – rsenna

+0

Ha logrado encontrar una solución: estoy tratando de hacer exactamente esto: la imagen cambiará de tamaño en varias versiones (por ejemplo, pulgar, pequeño, mediano, grande) Cada copia tendrá un procesamiento de imagen hecho (por ejemplo, filtro de convolución) Estas copias redimensionadas se cargarán en Amazon S3 Información sobre cada imagen ser almacenado en una base de datos (ancho, alto, tipo de MIME, nombre de archivo) pero no puedo tener éxito ¿podría ayudarme? – Marwan

Respuesta

3

El comentario de Rsenna se vincula a algo llamado WebSync que es una implementación de Comet basada en .NET. Excelente si necesita absolutamente notificaciones en tiempo real a medida que se completan los procesos asincrónicos.

Sin embargo, creo que las encuestas pasadas de moda pueden ser suficientes en su caso. SomeAsyncImageProcessor sigue siendo un proceso asíncrono (por lo que su aplicación no se congela).

Sin embargo, una vez que se devuelve el "éxito" al navegador (indicando que la carga se ha completado correctamente), su página comienza a sondear una URL de "estado" intervalos regulares, quizás 1 o 2 segundos (dependiendo de cuánto tiempo espera que tomen estos procesos).

Para cada imagen, en orden, se marca una URL de estado. http://mysite/imageprocessor/status?albumId=guid&stepid=3

La URL de estado devuelve un indicador de que el estado debe volver a comprobarse, o devuelve el resultado correcto y una URL a la miniatura amazónica (o URL en su sitio). Vuelva a verificar hasta que marque el paso final.

Cuestiones relacionadas