JavaのHttpServletRequestWrapperとgetPartsメソッドを徹底解説!初心者でもわかるマルチパートリクエストの処理方法
生徒
「JavaのWebアプリでファイルアップロードを処理したいんですが、どうやってリクエストからファイルを取り出せばいいんですか?」
先生
「その場合は、HttpServletRequestWrapperのgetPartsメソッドを使うと、フォームから送られた複数のパートデータを簡単に取得できますよ。」
生徒
「複数のファイルやテキストデータが同時に送られても対応できるんですか?」
先生
「その通りです。では、getPartsメソッドの使い方やポイントについて、順番にわかりやすく説明していきましょう。」
1. HttpServletRequestWrapperとは?
javax.servlet.httpパッケージの中にあるHttpServletRequestWrapperクラスは、HttpServletRequestオブジェクトをラップして、機能を拡張したり、一部のメソッドをカスタマイズしたりするために使われるラッパークラスです。
このクラスを使うことで、既存のリクエストに手を加えることなく、独自の処理や認証、パラメータの加工などができるようになります。
2. getPartsメソッドとは?
getPartsメソッドは、マルチパートリクエスト(フォームからのファイルアップロードなど)を処理するために使用されるメソッドです。これはHttpServletRequestインターフェースに定義されていて、HttpServletRequestWrapperでも使用できます。
このメソッドは、リクエスト内のすべてのパート(ファイルやテキストなど)をPartオブジェクトのコレクションとして返します。
public Collection<Part> getParts() throws IOException, ServletException
このgetPartsメソッドは、アップロードされたファイルやフォームの入力内容を扱うときにとても便利です。
3. getPartsメソッドを使う準備
このメソッドを使うには、Servletに@MultipartConfigアノテーションを付けておく必要があります。これは、Servletがマルチパートデータを受け取れるようにする設定です。
import javax.servlet.annotation.MultipartConfig;
@MultipartConfig
public class UploadServlet extends HttpServlet {
// ここに処理を記述
}
この設定がないと、getPartsを呼び出したときにエラーが発生してしまいます。
4. getPartsメソッドの使い方とサンプル
ここでは、HttpServletRequestWrapperを使って、アップロードされたファイルとテキスト情報を処理する例を紹介します。
import java.io.IOException;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequestWrapper wrappedRequest = new HttpServletRequestWrapper(request);
Collection<Part> parts = wrappedRequest.getParts();
for (Part part : parts) {
String name = part.getName();
String filename = part.getSubmittedFileName();
long size = part.getSize();
response.getWriter().println("パート名:" + name);
response.getWriter().println("ファイル名:" + filename);
response.getWriter().println("サイズ:" + size + "バイト");
}
}
}
このコードでは、フォームから送信されたすべてのパートを取得し、それぞれの名前・ファイル名・サイズを出力しています。
5. HTMLフォームの記述例
getPartsを正しく動作させるためには、HTML側のフォームにも注意が必要です。enctype属性をmultipart/form-dataに設定することを忘れずに行いましょう。
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="file" name="file1"><br>
<button type="submit">アップロード</button>
</form>
このように設定されたフォームから送信されるリクエストは、Java ServletでgetPartsを使って処理することができます。
6. getPartsとgetPartの違い
getPartsはすべてのパートを一括で取得するメソッドですが、getPart(String name)という別のメソッドも存在します。こちらは指定された名前のパートだけを取得したいときに使います。
Part filePart = request.getPart("file1");
アップロードフォームの特定のファイルだけを取得したい場合は、getPartを使うと便利です。複数パートを処理する場合はgetPartsを使うのが基本です。
7. getPartsを使ったエラーハンドリングのポイント
getPartsは、ファイルのサイズ制限を超えたり、正しくない形式で送信された場合に例外をスローすることがあります。安全なWebアプリケーションを作るためには、IOExceptionやServletExceptionへの対応をしっかり書くことが大切です。
try {
Collection<Part> parts = request.getParts();
// 処理を続行
} catch (IOException | ServletException e) {
e.printStackTrace();
response.getWriter().println("ファイルの取得に失敗しました。");
}
このようなエラーハンドリングを実装することで、想定外の状況でもアプリケーションが安定して動作します。