2010-12-13 37 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

相關問題