私は単純なアップロード機能を備えた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();
});
});
})。
アイデア?
コードは正常です。しかし、 'try'の直前に2つのコメントのいずれかをコメント解除すると、リダイレクトは本当に失敗する可能性があります(サーバログに' IllegalStateException'がある)。実行していると思うコードを実際に実行していますか? – BalusC
私は問題を追跡することができました。はい、そうです、アップロードハンドラは正常に動作します。問題は、実行中のフロントエンドjsスクリプトにあります。アップロードが成功するたびに、JSONレスポンスを返す必要があります。これにより、その後に添付されたコードはすべて失敗します。上記のコードを編集して問題を表示しました。これに修正がありますか? – Queryer