jsfページにファイルアップロードアプレットがあります。このアプレットは、POSTリクエストを送信できるアドレスを期待しています。(この投稿リクエストを編集して、フィールドなどを追加することはできません)。次に、サーブレットのpostメソッドがファイルを保存します。サーブレットには@MultiPartConfigアノテーションを付ける必要があり、このアノテーションをjsfマネージドBeanに追加できないため、このジョブはマネージドBeanでは実行できません。アップロードアプレットが同じセッションを使用するように強制するために、このトピックに従って、jsessionIdという名前のURL属性をPOSTリクエストに追加しました。これで、セッション中に複数のファイルをアップロードしようとすると、「regexp文字列 "^ SUCCESS $"が応答本文に見つかりませんでした」というエラーメッセージが表示されてアプレットが停止します。これは、アプレットがサーブレットの応答でこの文字列を予期しているためです。アップロードが成功したことを知るため。
アプレットのデバッグコードを表示すると、応答には多くのhtmlコードが含まれていますが、サーブレットコードに追加しても、この成功文字列は含まれていません。これが私のサーブレットのコードです:
@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>
2番目のファイルをアップロードしようとすると、「古い」(これは私が思うが、サーブレットについては十分に理解していない)応答は次のようになります。http://pastebin.ca/2300999 (文字が多すぎるため、そこにアップロードしてください)