2011-07-04 140 views
0

我有一個具有簡單上傳功能的Web應用程序。這個想法是讓用戶選擇一個文件,併成功上傳後,重定向到index.jspServlet中的response.sendRedirect()在文件上傳後無法正常工作

但是,雖然文件已上傳,但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的文件上傳上載事件處理程序。一切工作正常,除了重定向部分。

它處理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'之前取消註釋兩個outcomments中的一個,那麼重定向確實可能會失敗(在服務器日誌中帶有「IllegalStateException」)。你真的在運行你認爲你正在運行的代碼嗎? – BalusC

+0

我設法追查了這個問題。是的,你是對的,上傳處理程序工作正常。問題在於正在運行的前端js腳本。每次成功上傳後,都需要返回一個JSON響應,這會導致之後附加的任何代碼失敗。我編輯了上面的代碼來顯示問題。有沒有解決這個問題? – Queryer

回答

2

您試圖在單個請求上發送兩個響應。一個在響應正文中包含JSON數據,另一個將響應重定向到另一個請求。這是行不通的。您可以發送只有一個迴應每個請求。重定向需要一個未觸及的(未提交的)響應主體,否則重定向將僅在服務器日誌中以IllegalStateException: response already committed失敗。

您需要將重定向調用從servlet代碼移動到JavaScript代碼。擺脫servlet中的redirect()行,並添加以下行作爲$.getJSON()回調函數的最後一行。

window.location = '/index.jsp'; 

這樣JavaScript將負責重定向。