2010-12-13 9 views
1

ユーザーがファイルをダウンロードできるようにするコントローラがあります。 問題は、コントローラーに送信されるパラメーターに応じて、コントローラーが異なるフォルダーを圧縮してクライアントに送信し、ユーザーに空のブラウザー・タブとローダー・ヘッダーが表示されている間にジップが2分になることがあるということです。Spring MVC - ダウンロードが開始されるまで表示されるメッセージを表示する方法

ファイルが圧縮されてダウンロードが開始されるまで、ユーザーにメッセージを表示する方法はありますか? 「お待ちください、あなたのファイルはダウンロード準備中です!」のようなものです。

ありがとうございました!

答えて

3

これはspring mvcに固有のものではありません。これは、サーブレットやWebwork/structsアクションなど、あらゆる種類のWebベースのアクションで行うことができます。

ダウンロードを実行するために送信する要求は、.zipを作成するのではなく、zipを作成するタスクをキューに入れ、別のスレッド(threads?)がそれらの.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; 
     } 
    } 
} 

春のMVCとあまり慣れていないイム以来、上記(ライブラリ名/慣習の面で)少しオフになる場合もありますが、基本的な考え方があります - ZIPファイルの作成をキュータスクとして(ExecutorServiceのようなものを使用して)、ビューを素早くレンダリングします。その後、ビュー自体がリフレッシュ(メタリフレッシュタグを使用)されるか、AJAXが別のコントローラをポーリングしてタスクが完了したかどうかを確認します。そうであれば、ダウンロードURLにリダイレクトします。

+0

こんにちは!投稿してくれてありがとう、私はこれをチェックし、コメントをあなたに戻って取得:) –

関連する問題