我有一个带有简单上传功能的Web应用程序。我们的想法是允许用户选择文件,并在成功上传后重定向到index.jsp
。
但是,虽然文件已上传,但response.redirect
无效。成功上载后,页面不会被重定向。它就在那里。奇怪的是,我可以看到它正在处理来自tomcat服务器日志的index.jsp
,即使它没有被重定向。
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);
}
文件上传插件来自https://aquantum-demo.appspot.com/file-upload
我使用了前端并使用java apache fileupload开发了上传事件处理程序。除了重定向部分外,一切正常。
处理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();
});
});
});
有什么想法吗?
答案 0 :(得分:2)
您尝试在单个请求中发送两个回复。一个在响应主体中具有JSON数据,另一个在将响应重定向到另一个请求。这不会起作用。您可以针对每个请求发送仅一个响应。重定向需要一个未触及的(未提交的)响应主体,否则重定向将在服务器日志中以IllegalStateException: response already committed
失败。
您需要将重定向调用从servlet代码移动到JavaScript代码。摆脱servlet中的redirect()
行,并将以下行添加为$.getJSON()
回调函数的最后一行。
window.location = '/index.jsp';
这样JavaScript就可以处理重定向。