9

ここに私がやっていることがあります。私はAjaxを介して私のSpring Webアプリケーションにmultipartファイルをアップロードしたいと思います。サーバーはPOST要求を受信すると、データベースにチケット番号を作成します。次に、実際のファイルアップロードを処理するスレッドを開始します。その後、サーバーはチケット番号を返します。春の非同期ファイルアップロード

私は、CommonsMultipartResolverを使用してリクエストを処理しています。私は、resolveLazilyフラグをtrueに設定して、マルチパートが即座に解決されないようにしました。

だからここに私は

@Controller 
public class myController{ 

    @RequestMapping(value = "/upload", method = RequestMethod.POST) 
    @ResponseStatus(value = HttpStatus.OK) 
    @ResponseBody 
    public String upload(MultipartHttpServletRequest request, String fileName){ 

     String ticket = dao.createUploadTicket(fileName); 
     Runnable run = new Runnable(){ 

      @Override 
      public void run(){ 

       dao.writeUpdate(ticket, "Getting data from request"); 
       final MultipartFile file = request.getFile("theFile"); 
       dao.writeUpdate(ticket, "Multipart file processed"); 
       try { 
        dao.writeUpdate(ticket, "Saving file to disk"); 
        file.transferTo(new File("/myDirectory")); 
        dao.writeUpdate(ticket, "File saved to disk"); 
       } 
       catch(Exception e){ 
        dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString()); 
       } 
      } 
     }; 
     Thread t = new Thread(run); 
     t.start(); 
     return ticket; 
    } 
} 

ので、ここでのポイントは、チケット番号は、進行状況の更新を取得するために使用することができるということである持っているものの線に沿って何かです。大きなファイルがアップロードされているとします。ファイルのアップロードPOST(この例ではAjaxリクエスト)を行ったクライアントは、非同期でそれを行い、チケット番号を返すことができます。クライアントは、そのチケット番号を使用して、ファイルアップロードのステージを決定し、別のページに情報を表示することができます。

もう1つの使用方法は、サーバーにすべてのチケット番号を要求し、サーバー上で行われているすべてのファイルアップロードの「ライブ」ビューを表示するHTMLページを使用できることです。

コントローラが戻るとすぐにSpringがCommonsMultipartResolverのcleanupMultipart()を呼び出すため、これを動作させることができませんでした。 resolveLazilyフラグはfalseに設定されているので、cleanupMultipart()が呼び出されると、マルチパートファイルの解決と初期化が開始されます。これは、 "request.getFile(" theFile ");" runnableとcleanupMultipart()の呼び出しで、最終的に例外が発生します。

誰もが考えている?バックエンドの非同期ファイル処理をしたいと思って、ここで何らかのHTTP契約を破っていますか?

+0

Commention非同期いつでもそれ以降のファイル内容やチケットの(前のステップから受信した)チケット番号は

  • + AJAXゲットする現在の状況、。解決策を思いつくのに役立つかもしれない以下のブログが見つかりました。 http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/ https://blogs.oracle.com/ enterprisetechtips/entry/asynchronous_support_in_servlet_3 実際の例を考えれば、私は返信します。 – CAL5101

  • 答えて

    5

    HTTP要求はすでに独自のスレッドで実行されており、クライアントは非同期で並列に要求を行うことはほとんどできません。したがって、新しいスレッドを開始する必要はありません。メインスレッドで、いつものようにファイルを保存/処理するだけです。クライアント側でのみ '非同期ファイルアップロード'を作成してください。

    また、入力を処理したときにのみhttp応答を送信する必要があります。つまり、入力ヘッダーを読んでHTTPレスポンスを作成し、ブラウザからデータを読み続けることはできません。入力を消費する - >処理する - >出力を送信する、HTTP 1/1.1プロトコルの仕組み。

    アップロードし送信するためにチケット番号が必要な場合は、実際にアップロードする前に、同様に、2段階のアップロードを使用して、それを作成することができます。

    • Ajaxは、チケット番号
    • POST aを取得するための要求をGET自分のポストに
    +0

    が同意します。私はちょっとした説明を追加したい:user1404399が尋ねているのは、サーバー側の新しいスレッドによって「非同期アップロード」を行う方法であるが、この問題を処理する正しい方法はjavascriptでハンドルアップロードアクションを行うことである。他のアクションにポーリングすることにより、進行状況をユーザーに報告します。それはあなたのアイデアですか? –

    +0

    @HoàngLongright –

    +0

    回答ありがとうございます。私はこれが不可能であるという良い気持ちを持っていましたが、私は解決策を見つけるために押されていました。通常のファイルアップロードだけではなく、何かを実装することはありませんでした。 S.私は表示名をuser1404399より読みやすいものに更新しました – CAL5101