2011-07-04 20 views
0

私は単純なアップロード機能を備えたWebアプリケーションを持っています。このアイデアは、ユーザーがファイルを選択できるようにすることで、アップロードに成功するとindex.jspにリダイレクトされます。ファイルアップロード後にServletのresponse.sendRedirect()が正しく動作しない

ただし、ファイルはアップロードされましたが、response.redirectは機能しません。アップロードが正常に完了すると、ページはリダイレクトされません。それだけでそこにとどまる。奇妙なことは、私はそれがindex.jspをtomcatサーバーのログから処理しているのを見ることができますが、それはリダイレクトされません。

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    //processRequest(request, response); 
    boolean status=false; 
    if (!ServletFileUpload.isMultipartContent(request)) { 
     throw new IllegalArgumentException("Request is not multipart, please 'multipart/form-data' enctype for your form."); 
    } 

    ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory()); 
    PrintWriter writer = response.getWriter(); 
    response.setContentType("text/plain"); 
    try { 

     List<FileItem> items = uploadHandler.parseRequest(request); 
     for (FileItem item : items) { 
      if (!item.isFormField()) { 
       File file = new File(getServletContext().getRealPath("/WEB-INF/upload"), item.getName()); 
       item.write(file); 
       writer.write("{\"name\":\"" + item.getName() + "\",\"type\":\"" + item.getContentType() + "\",\"size\":\"" + item.getSize() + "\"}"); 

      } 

     } 

     //redirect to index.jsp if successfully 

     redirect(request, response); 

    } catch (FileUploadException e) { 
     throw new RuntimeException(e); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } finally { 
     writer.close(); 
    } 

} 

リダイレクト方法:

private void redirect(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    request.getRequestDispatcher("/index.jsp").forward(request, response); 
} 

ファイルアップロードプラグインは、私は、フロントエンドを使用し、Java Apacheのファイルアップロードを使用して、アップロード・イベント・ハンドラを開発しhttps://aquantum-demo.appspot.com/file-upload からです。リダイレクト部分以外はすべて正常に動作します。

JSONを返すハンドルapplication.jsファイル:

$(function() { 
// Initialize jQuery File Upload (Extended User Interface Version): 
$('#file_upload').fileUploadUIX(); 

// Load existing files: 
$.getJSON($('#file_upload').fileUploadUIX('option', 'url'), function (files) { 
    var options = $('#file_upload').fileUploadUIX('option'); 
    options.adjustMaxNumberOfFiles(-files.length); 
    $.each(files, function (index, file) { 
     options.buildDownloadRow(file, options) 
      .appendTo(options.downloadTable).fadeIn(); 
    }); 
}); 

})。

アイデア?

+1

コードは正常です。しかし、 'try'の直前に2つのコメントのいずれかをコメント解除すると、リダイレクトは本当に失敗する可能性があります(サーバログに' IllegalStateException'がある)。実行していると思うコードを実際に実行していますか? – BalusC

+0

私は問題を追跡することができました。はい、そうです、アップロードハンドラは正常に動作します。問題は、実行中のフロントエンドjsスクリプトにあります。アップロードが成功するたびに、JSONレスポンスを返す必要があります。これにより、その後に添付されたコードはすべて失敗します。上記のコードを編集して問題を表示しました。これに修正がありますか? – Queryer

答えて

2

1回のリクエストで2つの応答を送信しようとしています。 1つはレスポンス本文にJSONデータがあり、もう1つはレスポンスを別のリクエストにリダイレクトします。これはうまくいきません。 を返信するには、リクエストごとにを返信してください。リダイレクトには、応答しない(コミットされていない)応答本体が必要です。そうしないと、リダイレクトはサーバーログのIllegalStateException: response already committedで失敗します。

リダイレクトコールをサーブレットコードからJavaScriptコードに移動する必要があります。サーブレットのredirect()行を取り除き、次の行を$.getJSON()コールバック関数の最後の行として追加します。

window.location = '/index.jsp'; 

このようにしてJavaScriptがリダイレクトされます。