Spring MVC – как показать сообщение до начала загрузки

У меня есть контроллер, который позволяет пользователям загружать файл. Проблема в том, что в зависимости от параметров, отправленных на контроллер, контроллер будет сжимать разные папки и отправлять их клиентам, и сжатие может иногда занимать 2 минуты, время, когда пользователю предлагается пустая вкладка браузера и заголовок загрузки.

Есть ли способ показать пользователю сообщение до тех пор, пока файл не будет заархивирован и загрузка действительно не начнется? Что-то вроде "Пожалуйста, подождите, ваш файл готовится к загрузке!"

Спасибо!


person Adrian Pirvulescu    schedule 13.12.2010    source источник


Ответы (1)


Это не относится к spring mvc - вы можете сделать это с любым веб-действием (например, с сервлетами или веб-работами/структурами).

Запрос, который пользователь отправляет для выполнения загрузки, не должен создавать ZIP-файл, а должен ставить в очередь задачу, которая создает ZIP-файл, который затем другой поток (потоки?) может выполнить и создать эти ZIP-файлы.

E.g,

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 опрашивает другой контроллер, чтобы узнать, выполнена ли задача. Если это так, то перенаправьте на URL-адрес загрузки.

person Chii    schedule 13.12.2010
comment
Привет Чии! Спасибо за пост, я проверю это и вернусь к вам с комментарием :) - person Adrian Pirvulescu; 13.12.2010