Spring MVC - Как отобразить сообщение до начала загрузки - PullRequest
1 голос
/ 13 декабря 2010

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

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

Спасибо!

1 Ответ

3 голосов
/ 13 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...