有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringMVC如何在下载开始前在视图中显示消息

我有一个允许用户下载文件的控制器。 问题在于,根据发送给控制器的参数,控制器将压缩不同的文件夹并将其发送给客户端,压缩有时可能需要2分钟,而用户会收到一个空的浏览器选项卡和一个加载标题的提示

有没有一种方法可以在文件压缩并真正开始下载之前向用户显示消息?类似于“请稍候,您的文件正在准备下载!”

谢谢大家!


共 (1) 个答案

  1. # 1 楼答案

    这并不特定于spring mvc——您可以通过任何基于web的操作(如servlet或webwork/structs操作)来实现这一点

    用户发送的执行下载的请求不应创建。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的东西),然后快速渲染视图。然后,视图本身要么刷新(使用meta refresh标记),要么AJAX轮询另一个控制器以查看任务是否完成。如果是,则重定向到下载url