カテゴリ: Symfony 更新日: 2026/05/15

Symfonyでファイルアップロード付きフォームを作る方法を完全ガイド!初心者でもわかる実践ステップ

Symfonyでファイルアップロード付きフォームを作る方法
Symfonyでファイルアップロード付きフォームを作る方法

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

生徒

「Symfonyでフォームを作っているんですが、画像ファイルをアップロードする機能も追加したいんです。どうやって作るんでしょうか?」

先生

「Symfonyのフォームには、ファイル選択用の入力フィールドが用意されています。エンティティと組み合わせれば、画像の保存まで簡単に作れますよ。」

生徒

「実際にどんなコードを書くのか想像がつかなくて…。初心者でも作れますか?」

先生

「もちろんです。ファイルアップロードの仕組みは難しそうに見えますが、流れさえ理解すればとてもシンプルですよ。一緒に基本から見ていきましょう。」

1. Symfonyでファイルアップロードフォームを作る基本の考え方

1. Symfonyでファイルアップロードフォームを作る基本の考え方
1. Symfonyでファイルアップロードフォームを作る基本の考え方

Symfonyでファイルアップロード機能を作るためには、主に次の3つを理解する必要があります。

  • ① FormTypeに FileType を追加すること
  • ② コントローラでアップロードファイルを処理すること
  • ③ 保存先フォルダへファイルを移動すること

特に「ファイルをどのタイミングで保存するか」が重要で、Symfonyでは $uploadedFile->move() を使って安全に保存できます。

ファイルは危険も伴うため、バリデーションやファイル形式チェックも併せて行うのが一般的です。

2. FormTypeでファイル入力フィールドを定義する

2. FormTypeでファイル入力フィールドを定義する
2. FormTypeでファイル入力フィールドを定義する

Symfonyのフォームでファイルを扱うには、FileType を使います。これは、HTMLでいう <input type="file"> を生成するフィールドタイプです。


use Symfony\Component\Form\Extension\Core\Type\FileType;

$builder
    ->add('imageFile', FileType::class, [
        'label' => '画像をアップロード',
        'mapped' => false,
        'required' => false,
    ]);

特に重要なのは mapped: false です。 なぜなら、アップロードされるファイルは通常エンティティのプロパティではなく、 一度コントローラで処理して、ファイル名だけをエンティティに保存するからです。

3. Twigでファイルアップロードフォームを表示する

3. Twigでファイルアップロードフォームを表示する
3. Twigでファイルアップロードフォームを表示する

Twig側でファイルを扱うには、フォーム開始タグの中に enctype="multipart/form-data" が必ず必要です。 Symfonyでは {{ form_start(form) }} が自動で設定してくれます。


{{ form_start(form) }}
    {{ form_row(form.imageFile) }}
    <button class="btn btn-primary">送信</button>
{{ form_end(form) }}

form_row を使えばラベル・入力欄・エラー表示を自動でまとめてくれます。 Bootstrap と組み合わせることで、見た目も整ったフォームになります。

4. コントローラでアップロードファイルを処理する方法

4. コントローラでアップロードファイルを処理する方法
4. コントローラでアップロードファイルを処理する方法

ここがアップロード処理の中心です。 UploadedFile クラスを使って、ファイルを安全に保存します。


$imageFile = $form->get('imageFile')->getData();

if ($imageFile) {
    $newFilename = uniqid().'.'.$imageFile->guessExtension();
    $imageFile->move(
        $this->getParameter('upload_directory'),
        $newFilename
    );
    $entity->setImageName($newFilename);
}

このようにして、ファイルはサーバーの指定フォルダに保存され、 データベースには「ファイル名」だけが保存される仕組みになります。

uniqid() を使う理由は、ファイル名の衝突(同じ名前)を避けるためです。 ファイルの上書き事故を防ぐため、実践でもよく使われる方法です。

5. services.yamlでアップロード先を設定する

5. services.yamlでアップロード先を設定する
5. services.yamlでアップロード先を設定する

例えば /public/uploads にファイルを保存したい場合、設定ファイルでパスを指定します。


parameters:
    upload_directory: '%kernel.project_dir%/public/uploads'

こうしておくことでコントローラから $this->getParameter('upload_directory') で取得できます。

6. バリデーションで安全にファイルを受け取る

6. バリデーションで安全にファイルを受け取る
6. バリデーションで安全にファイルを受け取る

ファイルアップロードは危険も伴うため、安全性を高めるにはバリデーションが必須です。 Symfonyにはファイル専用のバリデーションがあります。


use Symfony\Component\Validator\Constraints\File;

new File([
    'maxSize' => '2M',
    'mimeTypes' => ['image/jpeg', 'image/png'],
    'mimeTypesMessage' => 'JPEG または PNG 画像を選択してください。',
])

不正ファイルや巨大ファイルを避けられるため、現場でもよく使われます。

7. 保存した画像を表示する方法

7. 保存した画像を表示する方法
7. 保存した画像を表示する方法

保存した画像を画面に表示するには、単にアップロードフォルダのパスを Twig に渡すだけです。


<img src="/uploads/{{ entity.imageName }}" alt="アップロード画像">

アップロードした内容をプレビューすると、ユーザーにとって使いやすい画面になります。

8. 全体の流れを初心者向けに整理してみよう

8. 全体の流れを初心者向けに整理してみよう
8. 全体の流れを初心者向けに整理してみよう

ファイルアップロードはやや複雑に見えるかもしれませんが、実際の流れは次のとおりです。

  • ① フォームで FileType を定義する
  • ② ユーザーがファイルを選ぶ
  • ③ コントローラでファイルを受け取る
  • ④ move() メソッドでサーバーに保存する
  • ⑤ ファイル名をエンティティに保存する
  • ⑥ Twigで画像を表示する

意外とシンプルで、初心者でも一度理解すればすぐ応用できる機能です。 Symfonyが用意している仕組みが整っているため、安全で再利用しやすい実装になります。

まとめ

まとめ
まとめ

Symfonyでファイルアップロード付きフォームを作る流れの整理

Symfonyでファイルアップロード機能を実装する場合は、フォーム作成、コントローラ処理、保存先設定、表示処理という流れを理解することが重要です。特にSymfonyのフォームコンポーネントは非常に強力で、エンティティと連携した入力フォームを簡単に作れるだけでなく、ファイルアップロードのような少し複雑な処理でも安全に実装できるよう設計されています。

まず最初に理解しておきたいのは、Symfonyではファイルそのものをエンティティへ直接保存するのではなく、アップロードされたファイルをサーバーのフォルダへ保存し、そのファイル名だけをデータベースへ保存するという考え方です。この方法を採用することで、データベースの容量増加を防ぎながら柔軟なファイル管理が可能になります。

フォーム側ではFileTypeを利用してファイル選択フィールドを作成します。このとき重要なのがmapped falseの設定です。これはエンティティへ直接マッピングしないという意味で、アップロードされたファイルを一度コントローラで受け取り、その後に任意の処理を行うために必要になります。


use Symfony\Component\Form\Extension\Core\Type\FileType;

$builder
    ->add('imageFile', FileType::class, [
        'label' => '画像アップロード',
        'mapped' => false,
        'required' => false,
    ]);

このようにFileTypeを追加することで、ユーザーは画像ファイルや資料ファイルなどをフォームから送信できるようになります。Symfonyは内部で安全なファイル処理の仕組みを持っているため、基本的な構造さえ理解していれば初心者でも安定したアップロード機能を構築できます。

コントローラでのファイル保存処理の重要ポイント

フォームから送信されたファイルはコントローラで受け取ります。SymfonyではUploadedFileクラスが用意されており、このクラスを使って安全にファイルを保存できます。特に重要なのがmoveメソッドです。このメソッドを利用することで指定したフォルダへファイルを移動しながら保存できます。

また実際の開発現場では同じファイル名の衝突を避けるため、保存時に新しいファイル名を生成する処理がよく行われます。その代表的な方法がuniqid関数を使った方法です。


$imageFile = $form->get('imageFile')->getData();

if ($imageFile) {

    $newFilename = uniqid().'.'.$imageFile->guessExtension();

    $imageFile->move(
        $this->getParameter('upload_directory'),
        $newFilename
    );

    $entity->setImageName($newFilename);

}

この処理によってファイルはサーバーの指定フォルダへ保存され、データベースにはファイル名のみが保存されます。画像管理やファイル管理の基本的な構造として、多くのSymfonyアプリケーションで利用されている実装方法です。

アップロードフォルダ設定と管理の考え方

アップロードファイルを保存するフォルダは設定ファイルで管理するのが一般的です。Symfonyではservices設定にパラメータを定義することで、コントローラから簡単に参照できます。このように設定を分離しておくことで、環境変更やフォルダ変更にも柔軟に対応できます。


parameters:
    upload_directory: '%kernel.project_dir%/public/uploads'

設定ファイルに保存先をまとめておくことで、アプリケーション全体で同じ保存場所を共有できるため保守性が高くなります。特に複数のファイルアップロード機能を持つシステムでは、このような設計が非常に重要になります。

安全なファイルアップロードのための対策

ファイルアップロードは便利な機能ですが、不正ファイルの送信や巨大ファイルのアップロードなどのリスクもあります。そのためSymfonyではFileバリデーションを利用してファイルサイズや形式をチェックする方法が広く使われています。


use Symfony\Component\Validator\Constraints\File;

new File([
    'maxSize' => '2M',
    'mimeTypes' => [
        'image/jpeg',
        'image/png'
    ],
    'mimeTypesMessage' => '画像ファイルを選択してください',
]);

このようなバリデーションを設定しておくことで、アプリケーションの安全性が大きく向上します。特に画像投稿機能やプロフィール画像アップロードなどでは必ず設定しておきたい重要な処理です。

アップロードした画像の表示方法

保存した画像はTwigテンプレートから簡単に表示できます。基本的には保存フォルダのパスとデータベースに保存されたファイル名を組み合わせるだけです。これによりユーザーがアップロードした画像を画面に表示できるようになります。


<img src="/uploads/{{ entity.imageName }}" alt="アップロード画像">

画像表示を組み合わせることで、ブログシステムや商品管理システム、プロフィール管理など多くの機能を実装できるようになります。Symfonyのフォーム機能とファイル管理の仕組みを理解すると、より実践的なウェブアプリケーションを作れるようになります。

Symfonyのファイルアップロード機能は一見複雑に感じるかもしれませんが、仕組みを分解するとフォーム定義、コントローラ処理、ファイル保存、表示処理というシンプルな構造になっています。この基本構造を理解しておくことで、画像投稿システム、資料アップロード機能、ユーザープロフィール画像登録など多くの応用機能をスムーズに開発できるようになります。

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

生徒

今日の内容を整理するとSymfonyでファイルアップロードフォームを作るにはまずFileTypeで入力欄を作りそのあとコントローラでファイルを受け取りサーバーのフォルダへ保存する流れになるという理解で合っていますか

先生

その理解で大丈夫です。特に大切なのはアップロードされたファイルを直接エンティティに保存するのではなく一度サーバーへ保存してからファイル名だけをデータベースへ登録するという仕組みです。この方法が現在のウェブ開発では一般的な設計になっています。

生徒

なるほどファイル名だけ保存することでデータベースが大きくならないという利点があるんですね。あとuniqidを使ってファイル名を変更していた理由も理解できました。同じ名前のファイルがあると上書きされてしまう可能性があるからですね。

先生

その通りです。さらに実際の開発ではバリデーションを使ってファイルサイズや画像形式を確認することも大切です。こうした安全対策を行うことで安定したファイルアップロード機能を実装できます。

生徒

Symfonyのフォーム機能とファイルアップロードの仕組みがつながって理解できました。これなら画像投稿機能やプロフィール画像アップロード機能も作れそうです。

先生

とても良い理解です。今回学んだフォーム作成ファイル保存バリデーション画像表示という流れは多くのSymfonyアプリケーションで使われる基本技術です。繰り返し実装してみることで自然に身につきますよ。

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルートとコントローラを対応付ける方法(名前付きルート)を初心者向けに解説
New2
Symfony
Symfonyで画像やファイルをアップロードする時のバリデーション完全ガイド!初心者でもわかる入力チェックの基本
New3
Laravel
Laravelで言語切替UIを作る!多言語対応(ローカリゼーション)実践ガイド
New4
CodeIgniter
CodeIgniterでローカル開発環境を構築する方法!初心者向け完全ガイド
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのキャッシュ管理を完全ガイド!初心者でもわかるメリットと注意点
No.2
Java&Spring記事人気No2
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
No.3
Java&Spring記事人気No3
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.4
Java&Spring記事人気No4
CodeIgniter
CodeIgniterとは?特徴・できること・他PHPフレームワークとの違いを完全解説
No.5
Java&Spring記事人気No5
Laravel
Laravelローカリゼーション入門!言語の取得と切り替え(App::getLocale / setLocale)を徹底解説
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterのビュー共通化ガイド!初心者でもわかる部分ビューの読み込みとinclude設計
No.7
Java&Spring記事人気No7
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み
No.8
Java&Spring記事人気No8
Symfony
TwigのHTMLエスケープとrawフィルタの使い方を完全解説!初心者にもわかるテンプレート表示のコツ