2010-12-13 5 views
1

J'ai un contrôleur qui permet aux utilisateurs de télécharger un fichier. Le problème est que selon les paramètres envoyés au contrôleur, le contrôleur zippe différents dossiers et les envoie aux clients, et le zipping peut prendre parfois 2 minutes, temps pendant que l'utilisateur est invité avec un onglet de navigateur vide et un en-tête de chargement .Spring MVC - Comment afficher un message dans la vue jusqu'au démarrage du téléchargement

Y at-il un moyen de montrer un message à l'utilisateur jusqu'à ce que le fichier soit compressé et que le téléchargement commence vraiment? Quelque chose comme "Veuillez patienter, votre fichier est en cours de préparation pour le téléchargement!"

Merci!

Répondre

3

Ceci n'est pas spécifique à spring mvc - vous pouvez le faire avec n'importe quel type d'action basée sur le Web (comme les servlets ou les actions webwork/structs).

La requête que l'utilisateur envoie pour effectuer le téléchargement ne doit pas créer le fichier .zip, mais mettre en file d'attente une tâche qui crée le fichier zip, puis un autre thread (threads?) Peut retirer et créer ces fichiers .zip.

Par exemple,

class CreateZipController extends AbstractController { 
//tokenService is soemthing that you can save a future with, and return a token for - can be anything reallly...like a map. 
    public ModelAndView handleRequestInternal(final HttpServletRequest request, HttpServletResponse response) throws Exception { 
     Future<ZipFile> zipTask = executorService.submit(new Callable<ZipFile>(){ 
      public ZipFile call() { 
       return createZipFile(request); 
      } 
     }); 
     String token = tokenService.saveTask(zipTask); 
     if (zipTask.isDone() { 
      ModelAndView mav = new ModelAndView("downloadView"); 
      mav.addObject("url", getDownloadUrlFrom(zipTask.get().getName())); 
      return mav; 
     } 
     ModelAndView mav = new ModelAndView("waitView"); 
     mav.addObject("message", "Please wait while zip is being created"); 
     mav.addObject("token", token); 
     return mav;   
    } 
} 


class GetZipController extends AbstractController { 

    public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     String token = request.getParameter("token"); 
     Future<ZipFile> zipTask = tokenService.getTaskFrom(token); 
     if (zipTask.isDone() { 
      ModelAndView mav = new ModelAndView("downloadView"); 
      mav.addObject("url", getDownloadUrlFrom(zipTask.get().getName())); 
      return mav;   
     } else { 
      ModelAndView mav = new ModelAndView("waitView"); 
      mav.addObject("message", "please wait while the zip is being built"); 
      return mav; 
     } 
    } 
} 

Depuis je ne suis pas trop familier avec mvc de printemps, ce qui précède peut être légèrement (en termes de noms de bibliothèques/conventions), mais l'idée de base est là - la queue la création de fichier zip comme une tâche (en utilisant quelque chose comme ExecutorService), puis rapidement afficher la vue. La vue elle-même est ensuite rafraîchie (utilisez la balise meta refresh), ou AJAX interroge un autre contrôleur pour voir si la tâche est terminée. Si c'est le cas, redirigez-vous vers l'URL de téléchargement.

+0

Salut Chii! Merci pour le post, je vais vérifier cela et revenir à vous avec un commentaire :) –

Questions connexes