ここに私がやっていることがあります。私は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契約を破っていますか?
Commention非同期いつでもそれ以降のファイル内容やチケットの(前のステップから受信した)チケット番号は