开发者

response.sendRedirect() in Servlet not working correctly after file upload

I have a web application with a simple upload function. The idea is to allow user select a file and upon successfully upload, redirect to index.jsp.

However, although the file got uploaded, the response.redirect is not work开发者_如何学Going. After a successfully upload, the page doesn't get redirected. It just stays there. The weird thing is that I can see it is processing the index.jsp from the tomcat server log even though it doesn;t get redirected.

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();
    }

}

The redirect method:

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

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

The file upload plugin is from https://aquantum-demo.appspot.com/file-upload I used the front-end and developed the upload event handler using java apache fileupload. Everything works fine except the redirect part.

The application.js file which handles the JSON returns:

$(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();
    });
});

});

Any ideas?


You're attempting to send two responses on a single request. One with JSON data in the response body and one which redirects the response to another request. This is not going to work. You can send only one response back per request. A redirect requires an untouched (uncommitted) response body, otherwise the redirect will just fail with IllegalStateException: response already committed in the server logs.

You need to move the redirect call from the servlet code to JavaScript code. Get rid of the redirect() line in the servlet and add the following line as the last line of the $.getJSON() callback function.

window.location = '/index.jsp';

This way JavaScript will take care of the redirect.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜