カテゴリ: Jakarta EE 更新日: 2025/12/02

Jakarta サーブレットでファイルをアップロードする方法を徹底解説!初心者でも分かるJakarta EE入門

Jakarta サーブレットでファイルをアップロードする方法
Jakarta サーブレットでファイルをアップロードする方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Jakarta サーブレットを使ってファイルをアップロードすることはできますか?」

先生

「できるよ。Jakarta EEのサーブレットには、マルチパートリクエストを処理する機能があって、画像やテキストファイルを簡単にアップロードできるんだ。」

生徒

「どうやって書けばいいのかイメージがつきません。」

先生

「それじゃあ、Jakarta サーブレットでファイルアップロードを実現する具体的な流れを順番に見ていこう。」

1. ファイルアップロードの基本と仕組み

1. ファイルアップロードの基本と仕組み
1. ファイルアップロードの基本と仕組み

Webアプリケーションでは、ユーザーが画像や文書ファイルをアップロードする場面が多くあります。例えば、プロフィール画像を設定したり、資料を投稿するシステムです。Jakarta サーブレットでは@MultipartConfigアノテーションを使ってマルチパートデータを受け取ることができます。

HTTPリクエストの中に複数のデータが含まれる「multipart/form-data」という形式をサーブレットが解析して、アップロードされたファイルを処理します。

2. HTMLフォームの準備

2. HTMLフォームの準備
2. HTMLフォームの準備

まず、ユーザーがファイルを選択してアップロードできるようにするため、HTML側でフォームを用意します。Jakarta サーブレットにデータを送信するにはenctype="multipart/form-data"を必ず指定する必要があります。


<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">アップロード</button>
</form>

ここでは、サーブレットのURLパターンを/uploadに設定しています。

3. Jakarta サーブレット側の実装

3. Jakarta サーブレット側の実装
3. Jakarta サーブレット側の実装

次に、アップロードされたファイルを処理するサーブレットを作成します。@MultipartConfigを付与し、request.getPart()でファイルを受け取ります。


import java.io.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) uploadDir.mkdir();

        filePart.write(uploadPath + File.separator + fileName);

        response.getWriter().println("ファイル " + fileName + " をアップロードしました。");
    }
}

このサーブレットはアップロードされたファイルをuploadsディレクトリに保存します。

4. アップロードしたファイルの保存場所と確認

4. アップロードしたファイルの保存場所と確認
4. アップロードしたファイルの保存場所と確認

保存先はサーバーのアプリケーションフォルダ内になります。実運用では、外部ストレージやデータベースと組み合わせて利用することが一般的です。例えば画像投稿サービスではアップロードされたファイルを専用ディレクトリに保存し、データベースにはファイルのパスやメタ情報を記録します。

5. 複数ファイルのアップロード

5. 複数ファイルのアップロード
5. 複数ファイルのアップロード

Jakarta サーブレットは複数ファイルのアップロードにも対応しています。HTML側でmultiple属性を付与し、サーブレット側でrequest.getParts()を使えば複数ファイルを順番に処理できます。


for (Part part : request.getParts()) {
    String fileName = part.getSubmittedFileName();
    if (fileName != null) {
        part.write(uploadPath + File.separator + fileName);
    }
}

このようにループ処理をすることで、ユーザーが一度に選んだ複数のファイルをサーバーに保存できます。

6. セキュリティと制限

6. セキュリティと制限
6. セキュリティと制限

ファイルアップロードではセキュリティに注意する必要があります。例えば、アップロードできるファイルサイズの上限を設定することが重要です。@MultipartConfigにはmaxFileSizemaxRequestSizeを指定して制御できます。


@MultipartConfig(maxFileSize = 1024 * 1024 * 5) // 5MBまで

また、拡張子チェックを行い、許可されていないファイル形式のアップロードを防止することも推奨されます。これはJakarta EEのWebアプリケーションで安全に運用するための基本です。

7. 実際のアプリケーションでの活用例

7. 実際のアプリケーションでの活用例
7. 実際のアプリケーションでの活用例

Jakarta サーブレットによるファイルアップロードは、プロフィール画像の登録、レポート提出、資料共有システムなど多くの場面で利用されます。Jakarta EEを使うことで、セッション管理や認証機能と組み合わせ、ユーザーごとに専用のアップロードフォルダを作成することも可能です。

これにより、単なるファイル転送にとどまらず、安全で効率的なファイル管理システムを構築することができます。

まとめ

まとめ
まとめ

Jakarta サーブレットを使ったファイルアップロードは、Webアプリケーションの機能として非常に利用頻度が高く、画像投稿、資料登録、プロフィール画像設定など、多様な用途で活用される大切な仕組みです。この記事で学んだように、HTMLフォームにmultipart/form-dataを設定し、サーブレット側では@MultipartConfigアノテーションを付与してマルチパートデータを受け取るという流れが基本となります。さらに、アップロードされたファイルを保存するディレクトリの作成、複数ファイルの処理、サイズ制限や拡張子チェックなどのセキュリティ対策も重要であり、これらを知っておくことでより安全で信頼性の高いアプリケーションを構築できます。 ファイルアップロード機能は一見難しいように見えますが、Jakarta サーブレットの機能を理解すれば、データの受け取りから保存、メタ情報の管理まで、安定した処理を実現できます。また、画像投稿サービスや資料共有ツールなど具体的な利用例をイメージすると、どのようにアプリケーションへ統合するべきかが見えてくるため、理解がより深まります。実際の業務システムでは外部ストレージと連携したり、ユーザーごとにファイル保存先を切り分けたりすることもあり、拡張性の高いアーキテクチャを構築できることも Jakarta EE の強みです。 Jakarta サーブレットでは、アップロードされたファイルをPartとして扱うため、ファイル名やサイズ、コンテンツタイプなど多くの情報にアクセスできます。これにより、ユーザーが誤った形式のファイルをアップロードするのを防ぐバリデーション処理を実装したり、ファイルパスを整形して安全な形式に変換したりなど、柔軟な制御が可能になります。さらに、複数のファイルをまとめてアップロードできる点は、写真アルバム、資料管理システム、業務レポート提出などさまざまな場面で役立ち、ユーザー体験の向上に直結します。 下記に、アップロードされたファイルの拡張子をチェックし、安全な形式のみを許可する例を示します。

サンプルコード:拡張子チェックを追加したファイルアップロード処理


@WebServlet("/upload")
@MultipartConfig(maxFileSize = 1024 * 1024 * 10)
public class SecureUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        if (fileName == null || !fileName.matches(".*\\.(png|jpg|jpeg|pdf)$")) {
            response.getWriter().println("許可されていないファイル形式です。");
            return;
        }

        String uploadPath = getServletContext().getRealPath("") + File.separator + "safeUploads";
        File dir = new File(uploadPath);
        if (!dir.exists()) dir.mkdir();

        filePart.write(uploadPath + File.separator + fileName);
        response.getWriter().println("安全にファイルを保存しました: " + fileName);
    }
}

このように、安全性を高めるための工夫を追加することで、業務システムとして安心して利用できるファイル管理を実現できます。特に、ファイル形式の制限やサイズ上限の設定は重要で、サーバー攻撃や意図しない負荷を防ぐ上で欠かせない対策です。さらに、アップロードされたファイルの保存先を適切に分離することで、ユーザーごとのデータ保護やアクセス管理も強化され、企業システムでも通用する実践的な設計が可能になります。 Jakarta サーブレットのファイルアップロード機能は、単なるデータ保存だけでなく、エラー処理、セキュリティ対策、ユーザー体験の向上など多くの要素と結びついているため、理解して実装できるようになると開発スキルが大きく向上します。これらを組み合わせることで、より安全で使いやすい Jakarta EE アプリケーションを作ることができ、Web 開発の幅が大きく広がるでしょう。

先生と生徒の振り返り会話

生徒

「サーブレットでファイルアップロードができることは知っていましたが、仕組みを理解したことで応用が広がりそうだと感じました。複数ファイルにも対応できるのは便利ですね。」

先生

「その気づきはとても重要だよ。特に@MultipartConfigを使った設定は基本だから、必ず覚えておくといいね。安全性の確保も大事だよ。」

生徒

「ファイルの拡張子チェックやサイズ制限は実際のアプリケーションでも必要になりますね。セキュリティの大切さがよく分かりました。」

先生

「その通りだね。ファイルアップロードは便利な分、注意点も多いから、正しい制御を行うことで安全なアプリケーションを作ることができるんだよ。」

生徒

「実際に使う場面を想像しながら学べたので理解しやすかったです。これならプロフィール画像投稿や資料共有などの機能も作れそうです!」

先生

「しっかり理解できているね。これから実装していく中で、より高度な処理にも挑戦していきましょう。」

カテゴリの一覧へ
新着記事
New1
Play Framework
Play Frameworkでフォームデータをコントローラで扱う方法を完全解説|Java初心者向けコントローラ入門
New2
Jakarta EE
Jakarta EE JSPにおけるJSTLとスクリプトレットの違いと使い分けを初心者向けに徹底解説
New3
Play Framework
Play Frameworkでクエリパラメータをコントローラで処理する方法を完全解説|Java初心者向け入門
New4
Play Framework
Play FrameworkとSpring Bootの違いを徹底比較!初心者でもわかるJavaフレームワーク入門
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEのリリースサイクルとバージョンの進化をやさしく解説!
No.2
Java&Spring記事人気No2
Jakarta EE
Jakarta サーブレットのHttpServletRequestを徹底解説!初心者でもわかる基本操作と使い方
No.3
Java&Spring記事人気No3
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
No.4
Java&Spring記事人気No4
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識
No.5
Java&Spring記事人気No5
Jakarta EE
Jakarta EE JSPでJSTL SQLタグを使った簡易データベースアクセスをやさしく解説
No.6
Java&Spring記事人気No6
Jakarta EE
Jakarta EE JSPにおけるJSTL国際化タグ(fmt:message)の使い方を初心者向けに完全解説
No.7
Java&Spring記事人気No7
Jakarta EE
Jakarta EE JSPでJSTLを使ったJSONやREST APIレスポンス処理を初心者向けにやさしく解説
No.8
Java&Spring記事人気No8
Play Framework
Play Frameworkでリクエストデータの受け取り方を完全解説|Java初心者向けコントローラ入門