Spring MVC – 如何在下载开始之前在视图中显示消息

我有一个允许用户下载文件的控制器。 问题是,根据发送到控制器的参数,控制器将压缩不同的文件夹并将它们发送到客户端,并且在用户被提示使用空浏览器选项卡和加载标题时,压缩有时需要2分钟。

有没有一种方法可以向用户显示消息,直到压缩文件并真正开始下载? 像“请等待,您的文件正准备下载!”之类的东西。

谢谢!

这不是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 zipTask = executorService.submit(new Callable(){ 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 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轮询另一个控制器以查看任务是否完成。 如果是,则重定向到下载URL。