カテゴリ: CodeIgniter 更新日: 2026/06/06

CodeIgniterでファイルアップロードをマスター!初心者向け完全ガイド

CodeIgniterでファイルアップロードフォームを作成する方法
CodeIgniterでファイルアップロードフォームを作成する方法

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

生徒

「PHPのフレームワークであるCodeIgniter(コードイグナイター)を使って、自分のパソコンにある画像などのファイルをサーバーに送る仕組みを作りたいです。どうすればいいですか?」

先生

「CodeIgniterには『ファイルアップロードクラス』という便利な道具箱が用意されています。これを使えば、難しい処理も簡単に書くことができますよ。」

生徒

「プログラミングが初めてでも大丈夫でしょうか?ファイルの保存場所や、送る時の決まりごとが難しそうで不安です。」

先生

「大丈夫です!一つずつ順番に進めていけば、あっという間にファイルアップロードの仕組みが完成します。まずは基本から一緒に学んでいきましょう!」

1. ファイルアップロードとは?(身近な例えで解説)

1. ファイルアップロードとは?(身近な例えで解説)
1. ファイルアップロードとは?(身近な例えで解説)

「ファイルアップロード」という言葉を聞くと難しく感じるかもしれませんが、実は私たちは日常生活でよくこの機能を使っています。 例えば、SNSで写真を投稿したり、履歴書をメールに添付して送ったり、クラウドストレージにデータを保存したりする動作がすべて「アップロード」です。

プログラミングの視点で言うと、「あなたの手元にあるパソコン(クライアント)」から「サービスを動かしているコンピュータ(サーバー)」へデータをコピーして移すことを指します。 このとき、勝手にファイルが送られないように、送り主が「これをお願いします!」とボタンを押して届ける仕組みが必要です。

今回学習するCodeIgniter(コードイグナイター)は、PHPという言葉を使ってウェブサイトを効率よく作るための「土台」のようなものです。 この土台には、ファイルを安全に、かつ簡単に受け取るための専用のルールがあらかじめ組み込まれています。

2. ファイルを送るための「窓口(フォーム)」を作ろう

2. ファイルを送るための「窓口(フォーム)」を作ろう
2. ファイルを送るための「窓口(フォーム)」を作ろう

まず最初に、ユーザーがファイルを選択して「送信」ボタンを押すための画面(フォーム)を作る必要があります。 ここで一番大切な決まりごとは、HTMLのformタグに特別な「おまじない」を書くことです。

通常、文字だけを送る場合は必要ありませんが、画像などの重たいファイルを送る時は、 enctype="multipart/form-data"という設定を必ず書かなければなりません。 これがないと、サーバー側は「あ、これはファイルなんだな」と認識できず、中身が空っぽで届いてしまいます。

では、まずは一番シンプルなアップロード用画面のコードを見てみましょう。


<!-- ファイルを送るための専用フォーム -->
<form action="upload/do_upload" method="post" enctype="multipart/form-data">
    <p>好きな画像を選んでね:</p>
    <!-- ファイルを選択するボタン -->
    <input type="file" name="userfile" size="20">
    <br><br>
    <!-- 送信ボタン -->
    <input type="submit" value="アップロード開始!">
</form>

このコードにあるinput type="file"が、パソコンの中からファイルを選ぶためのボタンを表示させる命令です。 name="userfile"という名前は後でプログラム側で「どのファイルを受け取るか」を特定するために使うので、忘れないようにしましょう。

3. サーバーでファイルを受け取る「司令塔(コントローラー)」の設定

3. サーバーでファイルを受け取る「司令塔(コントローラー)」の設定
3. サーバーでファイルを受け取る「司令塔(コントローラー)」の設定

画面からファイルが送られてきたら、次にそれを受け取って「どこに保存するか」「どんな種類のファイルなら許可するか」を決めるプログラムを書きます。 CodeIgniterでは「コントローラー」と呼ばれるファイルが、この司令塔の役割を果たします。

ここで「ライブラリ」という言葉が出てきます。ライブラリとは、特定の機能(今回はアップロード)をまとめた「便利なツールセット」のことです。 自分ですべての処理を書かなくても、このツールセットを呼び出すだけで、ファイルのサイズをチェックしたり、名前を変えたりといった複雑なことが可能になります。


// ファイルを受け取る司令塔(コントローラー)の例
public function do_upload() {
    // 保存先のフォルダや、許可するファイルの種類を設定します
    $config['upload_path']   = './uploads/'; // 保存する場所
    $config['allowed_types'] = 'gif|jpg|png'; // 許可する画像形式
    $config['max_size']      = 2048;          // 最大サイズ(2MBまで)

    // アップロード用のツールを読み込み、設定を反映させます
    $this->load->library('upload', $config);

    // 実際にアップロードを実行する命令です
    if (!$this->upload->do_upload('userfile')) {
        // 失敗したときの処理
        echo "エラーが発生しました";
    } else {
        // 成功したときの処理
        echo "アップロード成功!";
    }
}

4. ストレージ管理と保存先の準備

4. ストレージ管理と保存先の準備
4. ストレージ管理と保存先の準備

プログラムを書いただけでは、ファイルは保存されません。 実際にファイルを置くための「箱(フォルダ)」をサーバーの中に用意する必要があります。 これを「ストレージ管理」の一歩目として考えましょう。

例えば、先ほどのコードで'./uploads/'という場所を指定しました。 これは、CodeIgniterのメインファイルの隣に「uploads」という名前のフォルダを作っておく必要があるという意味です。

ここで初心者が一番つまずきやすいのが「パーミッション(権限)」です。 サーバーはセキュリティのために、勝手にファイルが書き込まれないよう鍵がかかっていることがあります。 「アップロードできないな?」と思ったら、そのフォルダに「書き込み許可(書き込む権利)」があるか確認してみましょう。 これを忘れると、いくらプログラムが正しくてもエラーになってしまいます。

5. アップロードされた情報の確認方法

5. アップロードされた情報の確認方法
5. アップロードされた情報の確認方法

無事にアップロードができたら、そのファイルがどんな名前で保存されたのか、サイズはどれくらいなのかを確認したくなりますよね。 CodeIgniterでは、data()という命令を使うことで、アップロードしたファイルの詳細情報を一括で取得できます。

取得できる情報には、「ファイル名」「拡張子(.jpgなどの種類)」「ファイルパス(保存場所の住所)」など、後の処理で役立つデータがたくさん詰まっています。 これを使って、データベースにファイル名を保存したり、画面に「この画像をアップしましたよ」と表示したりすることができます。


// アップロードされた詳細情報を取得して表示する例
if ($this->upload->do_upload('userfile')) {
    // 成功したファイルの情報を取り出します
    $file_data = $this->upload->data();
    
    // 取り出した情報の中から、ファイル名だけを表示してみます
    echo "保存されたファイル名は:" . $file_data['file_name'];
    echo "ファイルの種類は:" . $file_data['file_type'];
}

実行結果は以下のようになります。


保存されたファイル名は:my_photo.jpg
ファイルの種類は:image/jpeg

6. 安全なアップロードのためのルール作り

6. 安全なアップロードのためのルール作り
6. 安全なアップロードのためのルール作り

誰でも自由にファイルを送れるようにすると、悪意のある人がウイルスを送り込んだり、サーバーの容量をいっぱいにしたりする危険があります。 そのため、しっかりとした「制限」を設けることが大切です。

設定の項目でallowed_types(許可する種類)を指定しましたが、これは非常に重要です。 例えば、画像だけを扱いたいサイトならjpg|png|gifだけに限定し、プログラム実行ファイル(.phpなど)が送られないようにします。

また、max_width(画像の横幅)やmax_height(画像の縦幅)を設定することで、大きすぎる画像が送られてサーバーのメモリを消費しすぎるのを防ぐことも可能です。 これらはすべて$configという配列の中に書き込むだけで設定できます。

7. ファイル名が重ならないようにするテクニック

7. ファイル名が重ならないようにするテクニック
7. ファイル名が重ならないようにするテクニック

もし、Aさんが「image.jpg」という名前でアップロードし、その後にBさんも「image.jpg」という名前でアップロードしたらどうなるでしょうか? 通常の設定だと、古いファイルが新しいファイルに上書きされて消えてしまいます。

これを防ぐために、CodeIgniterには自動でファイル名をバラバラにする機能があります。 $config['encrypt_name'] = TRUE;と設定ファイルに一行加えるだけで、ファイル名を「a1b2c3d4...」のようなランダムな英数字に変えてくれます。 これにより、同じ名前のファイルを何回送っても、中身が消える心配がなくなります。


// ファイル名を暗号化(ランダム化)する設定
$config['upload_path']   = './uploads/';
$config['allowed_types'] = 'jpg|png';
$config['encrypt_name']  = TRUE; // これで名前が重ならない!

$this->load->library('upload', $config);
$this->upload->do_upload('userfile');

8. エラーが起きたときの対処法

8. エラーが起きたときの対処法
8. エラーが起きたときの対処法

「ファイルが大きすぎる」「許可されていない形式」「フォルダが見つからない」など、アップロードには失敗がつきものです。 そんなとき、ユーザーに「何がダメだったのか」を教えてあげるのは親切な設計です。

CodeIgniterでは、display_errors()という命令を使うことで、エラーメッセージを自動で作成してくれます。 これを使えば、初心者の開発者でもどこを直すべきかすぐに分かります。


// エラーの内容を画面に表示する
if (!$this->upload->do_upload('userfile')) {
    $error_message = $this->upload->display_errors();
    echo "アップロードできませんでした。理由:" . $error_message;
}

実行結果(ファイルが大きすぎた場合など):


アップロードできませんでした。理由:The file you are attempting to upload is larger than the permitted size.

9. たくさんのファイルを一度に送るには?

9. たくさんのファイルを一度に送るには?
9. たくさんのファイルを一度に送るには?

これまでは1つのファイルについて説明してきましたが、複数のファイルを一度に送りたい場面もありますよね。 実は、基本的な仕組みは同じです。画面(フォーム)に複数の入力欄を作り、受け取り側のプログラムで順番に処理していきます。

CodeIgniterの標準機能では、1つずつループ(繰り返し処理)させて保存する方法が一般的です。 初心者の方はまず、1つのファイルを完璧に送れるようになってから、複数アップロードに挑戦するのが上達の近道です。

今回学んだ「フォーム作成」「設定の準備」「ライブラリの読み込み」「実行」という4つのステップをしっかり覚えれば、CodeIgniterでのファイル操作は怖くありません。 ぜひ、自分の好きな画像を使ってテストしてみてください。

10. 現場で役立つアップロードの豆知識

10. 現場で役立つアップロードの豆知識
10. 現場で役立つアップロードの豆知識

最後に、少しだけ先の役立つ知識をお伝えします。 実際のウェブサイト制作では、アップロードした画像を縮小して「サムネイル(小さな見本画像)」を作ることがよくあります。 CodeIgniterには、ファイルアップロード以外にも「画像加工クラス」というものがあり、これらを組み合わせることで、アップロードした瞬間に画像を小さく切り抜くといった高度なこともできるようになります。

まずはファイルの「保存」を完璧にし、次にその「活用」へと進んでいきましょう。 一歩ずつ進めば、あなたも立派なウェブエンジニアの仲間入りです!

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelでリダイレクトやフラッシュメッセージをテストする方法を完全解説!初心者向けLaravelテスト入門
New3
CodeIgniter
CodeIgniterのセキュリティ対策を完全ガイド!初心者が守るべき基本設定
New4
Symfony
SymfonyのEventSubscriberとEventListenerの違いを初心者向けにやさしく解説
人気記事
No.2
Java&Spring記事人気No2
Laravel
LaravelでReactコンポーネントを組み込む方法完全ガイド!JSX対応でフロントエンド連携を学ぼう
No.3
Java&Spring記事人気No3
Laravel
LaravelのRESTfulコントローラ設計のベストプラクティスを初心者向けにわかりやすく解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのold()関数でフォーム再表示時に値を保持する方法
No.5
Java&Spring記事人気No5
Laravel
LaravelをDockerで動かすメリットと導入の全体像を徹底解説!初心者向け入門ガイド
No.6
Java&Spring記事人気No6
Symfony
Symfonyのインストール方法!CLIとComposerの導入手順まとめ
No.7
Java&Spring記事人気No7
Symfony
Symfonyでバリデーションをコントローラに組み込む方法を徹底解説!初心者にもやさしい入力チェックの基本
No.8
Java&Spring記事人気No8
CodeIgniter
CodeIgniterのルーティングを徹底解説!ルートパラメータの使い方入門