2010-12-13 33 views
1

我有一个控制器,允许用户下载文件。 问题是,根据发送给控制器的参数,控制器会压缩不同的文件夹并将它们发送给客户端,并且压缩过程有时可能需要2分钟时间,而提示用户使用空白浏览器选项卡和加载标题时。Spring MVC - 如何显示消息,直到下载开始

有没有一种方法可以向用户显示一条消息,直到文件被压缩并下载真正开始?诸如“请稍候,您的文件正准备下载!”

谢谢!

回答

3

这不是特定于spring mvc - 你可以使用任何基于web的动作(如servlet或webwork/structs动作)来完成此操作。

用户发送执行下载的请求不应该创建.zip,而是将创建zip的任务排队,然后另一个线程(线程?)可以启动并创建这些.zip文件。

例如,

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; 
     } 
    } 
} 

由于我不是太熟悉Spring MVC的,上面可能会稍微偏离(在库名/公约的条款),但其基本思想是存在的 - 排队的zip文件的创建作为一个任务(使用类似ExecutorService的东西),然后快速渲染视图。然后视图本身会刷新(使用元刷新标记),或者AJAX轮询另一个控制器以查看任务是否完成。如果是,则重定向到下载网址。

+0

Hi Chii!感谢这篇文章,我会检查这个并回复给你评论:) – 2010-12-13 14:39:05