Jakarta EE JSPでファイルアップロードをわかりやすく解説!初心者向けガイド
生徒
「Jakarta EEのJSPでファイルアップロードはできますか?例えば画像やPDFをアップロードして、サーバーに保存したいです。」
先生
「JSPとServletを組み合わせれば、画像やテキストファイル、PDFなど色々なファイルをアップロードできます。初心者でもできるように手順をゆっくり説明します。」
生徒
「JSPのフォームタグで送信するだけでは駄目なんですか?」
先生
「普通のフォームではファイルを送れません。ファイルアップロード専用の設定が必要です。Jakarta EEではServlet側でファイルを受け取り、JSPはフォーム画面を作る役割になります。」
生徒
「なるほど。実際にどう作ればいいか知りたいです!」
先生
「では、JSPでアップロードフォームを作り、Servletでファイルを保存するところまで解説します。」
1. JSPでファイルアップロードができる仕組み
Jakarta EEのJSPでファイルアップロードを行う場合、多くの初心者が「フォームで投稿するだけ」と考えます。しかし、ファイルアップロードには特別な設定が必要です。通常のテキストデータとは違い、画像やPDFを送信するにはenctype="multipart/form-data"を指定します。これがないと、サーバーはファイルを受け取れません。
さらに、JSPだけで完結するのではなく、サーバー側のServletで処理します。JSPは画面、Servletは処理、という役割分担が基本になります。ファイルアップロードは初心者がつまずきやすいテーマですが、仕組みさえ理解すれば難しくありません。Jakarta EEのServletはファイルを受信して保存できる機能を持っており、後からDBや別のアプリに連携することもできます。
2. JSPでアップロードフォームを作成する
まずはJSPでファイルを送信するフォームを作ります。ここでは画像をアップロードする例を紹介します。Bootstrapのclassを使えば、見た目も整ったアップロードフォームになります。重要なのはmethod="post"とenctype="multipart/form-data"の2つです。この二つがないとファイルは送られません。
<form class="p-3" action="upload" method="post" enctype="multipart/form-data">
<div class="mb-3">
<label class="form-label">アップロードファイルを選択</label>
<input type="file" class="form-control" name="uploadFile">
</div>
<button class="btn btn-primary" type="submit">
<i class="bi bi-cloud-upload-fill"></i> アップロード
</button>
</form>
このJSPを表示すると画面からファイルを選択し、送信できます。初心者がよく忘れるのがenctypeです。テキスト送信のままだとファイルは壊れたり、そもそも送られてこなかったりします。サーバー側のServletでは、このname="uploadFile"で送られてくるデータを受け取ります。
3. Servletでアップロードファイルを受け取り保存する
次に、Jakarta Servletでファイルを処理します。Servletはクライアントからのリクエストを受け取り、ファイル保存処理を行います。初心者が驚くポイントとして、Servletにはファイルサイズ制限や保存先ディレクトリの設定があります。今回は簡単な画像保存処理を紹介します。
package example;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
@MultipartConfig(location="/tmp")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try {
Part part = request.getPart("uploadFile");
String fileName = part.getSubmittedFileName();
InputStream in = part.getInputStream();
File file = new File("/tmp/" + fileName);
FileOutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
out.close();
in.close();
response.getWriter().println("アップロード完了: " + fileName);
} catch (Exception e) {
throw new ServletException(e);
}
}
}
このServletでは、@MultipartConfigでファイルアップロードを許可しています。ファイルを受け取って保存する処理は、バイト単位で読み書きするだけです。初心者でも理解しやすい仕組みです。サーバーの保存先は環境に合わせて変更できます。例えば、画像アップロードサービス、プロフィール画像、資料管理など実用的な機能に応用できます。
4. web.xmlにServletを登録して動作させる
Jakarta EEのServletは、web.xmlでURLとクラスを紐づけます。たとえばuploadというURLで呼び出したい場合、次のような設定を追加します。これでJSPのフォームから送信されたファイルがServletに渡ります。
<servlet>
<servlet-name>fileUpload</servlet-name>
<servlet-class>example.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUpload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
これでJSPのフォームで送信したデータがServletに届きます。初心者が混乱しやすいのは、URLとServletクラスの対応付けです。ここで設定を間違えると「404エラー」が表示されてしまいます。フォームのaction="upload"と、web.xmlのurl-patternが一致しているかを確認しましょう。
5. 実際に試して動作を確認する
ファイルアップロードを試すときは、画像ファイルやテキストファイルを選んで送信します。保存先のディレクトリにファイルが作成されていれば成功です。エラーメッセージが出る場合は、権限不足やパス設定が原因のことが多いです。特にWindowsやLinuxでは保存先のフォルダ権限に注意が必要です。
Jakarta EEはサーバーサイドでファイル処理ができるため、Webアプリでのプロフィール画像アップロード、資料管理、ログの保存など実践的な開発に応用できます。JSPとServletの役割分担を理解すれば、初心者でも本格的なWebアプリが作れます。
6. 画像を表示するサンプルJSP
保存した画像をJSPから表示することもできます。サーバーに保存したファイルを読み込み、ブラウザで確認できます。次のサンプルは保存されたファイルをタグで表示する例です。
<img src="/uploaded/sample.png" class="img-thumbnail">
このように、ファイルアップロードはJakarta EEの基本機能の一つであり、多くのWebシステムで利用されています。初心者のうちから理解しておくと、後の開発がとても楽になります。