我的 jsf 页面中有一个文件上传小程序。这个小程序需要一个可以发送它的 POST 请求的地址。(我无法编辑此帖子请求以添加更多字段或其他内容)。然后我的 servlet 的 post 方法存储该文件。这项工作不能由托管 bean 完成,因为 servlet 必须使用 @MultiPartConfig 进行注释,并且我无法将此注释添加到 jsf 托管 bean。为了强制上传小程序使用相同的会话,我根据这个主题在 post 请求中添加了一个名为 jsessionId 的 URL 属性. 现在,每当我在会话期间尝试上传多个文件时,小程序都会停止并显示错误消息“在响应正文中找不到正则表达式字符串“^SUCCESS$””,这是因为小程序在 servlet 响应中需要此字符串为了知道上传成功。
当我查看小程序的调试代码时,响应包含很多 html 代码,但没有这个成功字符串,尽管我将它添加到我的 Servlet 代码中。这是我的 servlet 的代码:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.reset();
if (!userBean.getUploadedDatasets().isEmpty()) {
String datasetID = userBean.getUploadedDatasets().getLast().replaceAll("/", "%2F");
response.sendRedirect(response.encodeRedirectURL("http://____________/faces/details.xhtml?id="+datasetID));
}
}
/**
* Handles the HTTP
* <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
PrintWriter out = null;
try {
Part filePart = request.getPart("item");
InputStream filecontent = filePart.getInputStream();
String datasetID = repBean.persistDataset(filecontent, uploadBean.getFolder());
userBean.getUploadedDatasets().add(datasetID);
out = response.getWriter();
out.println("SUCCESS");
} catch (ServletException ex) {
Logger.getLogger(RequestHandler.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(RequestHandler.class.getName()).log(Level.SEVERE, null, ex);
}finally{
out.close();
}
}
小程序使用 doGet 方法作为 afterUploadURL (这是上传文件后跳转到的 url)
小程序代码是:
<APPLET
CODE="wjhk.jupload2.JUploadApplet"
NAME="JUpload"
ARCHIVE="wjhk.jupload.jar"
WIDTH="640"
HEIGHT="300"
MAYSCRIPT="true"
ALT="The java pugin must be installed.">
<param name="postURL" value="http://________________/request;jsessionid=#{session.id}" />
<!-- Optionnal, see code comments -->
<param name="showLogWindow" value="false" />
<param name="debugLevel" value="99" />
<param name="httpUploadParameterName" value="item" />
<param name="nbFilesPerRequest" value="1" />
<param name="httpUploadParameterType" value="oneFile" />
<param name="afterUploadURL" value="http://________________/request" />
</APPLET>
在尝试上传第二个文件后,“旧”(这是我的想法,但我对 servlet 了解不够)响应如下所示: http: //pastebin.ca/2300999 (字符太多,所以我不得不上传到那里)